Moo*_*oon 3 c# multithreading winforms
我可以做任何功能吗?
public void myfunc()
{
//some processing
}
Run Code Online (Sandbox Code Playgroud)
一个线程函数
Thread t = new Thread (new ThreadStart (myfunc));
Run Code Online (Sandbox Code Playgroud)
然后一些在哪里
t.Start();
Run Code Online (Sandbox Code Playgroud)
我可以传递任何类型的论点吗?
有一个接受对象状态的重载 - 但是,IMO将任意参数传递给线程启动(并在编译时验证签名)的最简单方法是使用匿名方法:
int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});
Run Code Online (Sandbox Code Playgroud)
只是(这很重要) - *不要改变a或b在此之后,因为改变将反映到线程(作为竞赛) - 即不要做:
int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});
a = 12; // this change will be visible to the anonymous method - be careful ;-p
Run Code Online (Sandbox Code Playgroud)
在循环的情况下,重要的是(当处理异步和捕获的变量时)为此引入额外的变量; 这些是非常不同的
int[] data = {1,2,3,4,5};
foreach(int i in data) {
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(i); });
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
(可能打印5,5,5,5,5)
int[] data = {1,2,3,4,5};
foreach (int i in data) {
int tmp = i;
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(tmp); });
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
(将按特定顺序打印1-5)
更新以讨论Meeh的观点(评论); 什么打印(99.999%的时间 - 有竞争条件)?
string s = "dreams";
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(s);
});
s = "reality";
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
理论上,只要遵循一些规则(例如同步,调用委托更新ui等),就可以使任何方法在单独的线程中执行.
根据您的问题,我了解您对多线程编程没有太多经验,所以我建议您阅读很多关于线程的知识,并了解可能出现的危险和问题.您也可以使用后台工作者类来承担您的一些职责.
此外,是的,您可以将参数传递给线程方法:
private class ThreadParameters
{
....
}
...
public void ThreadFunc(object state)
{
ThreadParameters params = (ThreadParameters)state;
....
}
Thread t = new Thread(new ParameterizedThreadStart(ThreadFunc));
t.Start(new ThreadParameters() { ... });
Run Code Online (Sandbox Code Playgroud)