6
votes

Passer des paramètres à un fil

Je veux transmettre une fonction qui prend un paramètre sur le constructeur de threadstart en C #. Mais, il semble que cela ne soit pas possible, car je reçois une erreur de syntaxe, j'essaie de faire quelque chose comme ça xxx

où obj1 est un objet de type list < / code> (disons).

Si je veux qu'un thread exécute cette fonction qui prend dans un objet en tant que paramètre, et je prévois de créer 2 de ces threads simultanément avec des valeurs de paramètre différentes quelle est la meilleure méthode pour atteindre cela?


2 commentaires

Quelle version de .NET utilisez-vous?


Wow! Je l'ai déjà fait précédemment en créant une classe pour contenir des données que le fil utilisera, mais je n'avais aucune idée qu'il y avait tant de façons différentes de peaufler cet animal!


9 Réponses :


13
votes

Si vous utilisez .NET 3.5 ou plus, une option consiste à utiliser une Lambda pour cette suivante:

var myThread = new System.Threading.Thread(() => func1(obj1)); 


0 commentaires

3
votes

Essayez ceci: xxx

ou dans votre cas: xxx


0 commentaires

7
votes

Vous pouvez démarrer un nouveau fil comme celui-ci: xxx

à l'intérieur du méthode anonyme Vous avez accès aux variables dans la portée lorsque le délégué a été créé.


0 commentaires

8
votes

2 commentaires

Merci beaucoup .. Cette méthode fonctionne .. Toutefois, la définition de Func1 dans ce cas devra être annulée Func1 (État d'objet) et ne peut pas être vide Func1 (Liste Obj1) Pourquoi est-ce le cas?


C'est ainsi que le type de délégué paramétrizeTheadStartStart est défini. Vous devrez lancer l'objet Retour à la liste LIST INTÉRIEUR FUNC1 .



3
votes

Editez Assassin a eu du mal à faire fonctionner ce code. J'ai donc inclus une application de console complète à la fin de ce message. strong>


using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Threading.Thread t = new System.Threading.Thread(MyThreadStart);
            t.Start("Hello");
            System.Console.ReadLine();
        }


        static void MyThreadStart(object state)
        {
            System.Console.WriteLine((string)state);
        }
    }
}



2 commentaires

Cela ne fonctionne pas .. Je l'ai essayé ... La méthode paramétrizetrizedTheadStart suggérée par Thomas fonctionne.


@assassin je vous assure, ça marche. J'ai édité mon entrée pour inclure une application de console que vous pouvez coller directement dans Visual Studio et exécuter. Cette syntaxe a fonctionné depuis que .NET 2.0, et si vous remplacez le "nouveau thread (myThreadstart)" avec "nouveau thread (nouveau délégué




3
votes

Est-ce l'effet que vous recherchez?

        static void Main(string[] args)
    {
        var list = new List<string>(){
            "a","b","c"
        };

        Thread t1 = new Thread(new ParameterizedThreadStart(DoWork));

        t1.Start(list);

        Console.ReadLine();

    }

    public static void DoWork(object stuff)
    {
        foreach (var item in stuff as List<string>)
        {
            Console.WriteLine(item);
        }
    }


0 commentaires

1
votes
static void func1(object parameter)
{
   // Do stuff here.
}

static void Main(string[] args)
{
  List<string> obj1 = new List<string>();
  Thread t1 = new Thread(func1);
  t1.Start(obj1);
}
It's using a new delegate in .Net 2.0 called ParameterizedThreadStart. You can read about it here.

0 commentaires