C#线程函数

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)

我可以传递任何类型的论点吗?

Mar*_*ell 7

有一个接受对象状态的重载 - 但是,IMO将任意参数传递给线程启动(并在编译时验证签名)的最简单方法是使用匿名方法:

int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});
Run Code Online (Sandbox Code Playgroud)

只是(这很重要) - *不要改变ab在此之后,因为改变将反映到线程(作为竞赛) - 即不要做:

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)


Tho*_*mar 6

理论上,只要遵循一些规则(例如同步,调用委托更新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)