ThreadStart avec paramètres
14 réponses
Oui:
Thread t = new Thread (new ParameterizedThreadStart(myMethod));
t.Start (myParameterObject);
L'une des 2 surcharges du constructeur de Thread prend un délégué ParameterizedThreadStart qui vous permet de passer un seul paramètre à la méthode start. Malheureusement, il ne permet qu'un seul paramètre, et il le fait d'une façon dangereuse car elle passe comme objet. Je trouve qu'il est beaucoup plus facile d'utiliser une expression lambda pour capturer les paramètres pertinents et les transmettre de manière fortement typée.
Essayez ce qui suit
public Thread StartTheThread(SomeType param1, SomeOtherType param2) {
var t = new Thread(() => RealStart(param1, param2));
t.Start();
return t;
}
private static void RealStart(SomeType param1, SomeOtherType param2) {
...
}
Vous pouvez utiliser des expressions lambda
private void MyMethod(string param1,int param2)
{
//do stuff
}
Thread myNewThread = new Thread(() => MyMethod("param1",5));
myNewThread.Start();
C'est jusqu'à présent la meilleure réponse que j'ai pu trouver, c'est rapide et facile.
Thread thread = new Thread(Work);
thread.Start(Parameter);
private void Work(object param)
{
string Parameter = (string)param;
}
Le type de paramètre doit être un objet.
Modifier:
Bien que cette réponse ne soit pas incorrecte, je recommande contre cette approche. L'utilisation d'une expression lambda est beaucoup plus facile à lire et ne nécessite pas de conversion de type. Voir ici: https://stackoverflow.com/a/1195915/52551
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod));
t.Start("My Parameter");
}
static void ThreadMethod(object parameter)
{
// parameter equals to "My Parameter"
}
}
Moyen Simple en utilisant lambda comme ça..
Thread t = new Thread(() => DoSomething("param1", "param2"));
t.Start();
OU, vous pourriez même delegate
utiliser ThreadStart
comme si...
ThreadStart ts = delegate
{
bool moreWork = DoWork("param1", "param2", "param3");
if (moreWork)
{
DoMoreWork("param1", "param2");
}
};
new Thread(ts).Start();
J'avais un problème dans le paramètre passé. J'ai passé un entier d'une boucle for à la fonction et l'ai affiché, mais il a toujours donné des résultats différents. comme (1,2,2,3) (1,2,3,3) (1,1,2,3), etc ParametrizedThreadStart délégué.
Ce code simple a fonctionné comme un charme
Thread thread = new Thread(Work);
thread.Start(Parameter);
private void Work(object param)
{
string Parameter = (string)param;
}
Le ParameterizedThreadStart
prend un paramètre. Vous pouvez l'utiliser pour envoyer un paramètre, ou une classe personnalisée contenant plusieurs propriétés.
Une autre méthode consiste à placer la méthode que vous souhaitez démarrer en tant que membre d'instance dans une classe avec les propriétés des paramètres que vous souhaitez définir. Créez une instance de la classe, définissez les propriétés et démarrez le thread en spécifiant l'instance et la méthode, et la méthode peut accéder aux propriétés.
Vous pouvez utiliser un délégué ParametrizedThreadStart :
string parameter = "Hello world!";
Thread t = new Thread(new ParameterizedThreadStart(MyMethod));
t.Start(parameter);
Vous pouvez utiliser le BackgroundWorker RunWorkerAsync méthode et passer votre valeur.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp6
{
class Program
{
static void Main(string[] args)
{
int x = 10;
Thread t1 =new Thread(new ParameterizedThreadStart(order1));
t1.IsBackground = true;//i can stope
t1.Start(x);
Thread t2=new Thread(order2);
t2.Priority = ThreadPriority.Highest;
t2.Start();
Console.ReadKey();
}//Main
static void order1(object args)
{
int x = (int)args;
for (int i = 0; i < x; i++)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(i.ToString() + " ");
}
}
static void order2()
{
for (int i = 100; i > 0; i--)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(i.ToString() + " ");
}
}`enter code here`
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp6
{
class Program
{
static void Main(string[] args)
{
int x = 10;
Thread t1 =new Thread(new ParameterizedThreadStart(order1));
t1.Start(x);
Thread t2=new Thread(order2);
t2.Priority = ThreadPriority.Highest;
t2.Start();
Console.ReadKey();
}//Main
static void order1(object args)
{
int x = (int)args;
for (int i = 0; i < x; i++)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(i.ToString() + " ");
}
}
static void order2()
{
for (int i = 100; i > 0; i--)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(i.ToString() + " ");
}
}
}
}