aha*_*ron 5 c# multithreading activation
我在C#中有这个代码:
Thread t1 = new Thread(functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(functionsActivations(3, 4000, 5, 9));
t1.start();
t2.Start();
Thread t3 = new Thread(functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(functionsActivations(4, 4000, 5, 9));
Run Code Online (Sandbox Code Playgroud)
它不起作用.我怎么能告诉它调用我给它的方法?其次,我想在t1和t2完成运行后激活t3和t4.我怎样才能做到这一点?第三,我希望t1和t2不被阻塞(因此t2不必等到t1结束).我做的是正确的吗?
“它不起作用”并不是一组非常明确的症状。你在观察什么?
编辑:好的,现在您已经说了编译器错误是什么,诊断起来就容易多了。您当前正在调用一个方法并尝试将结果用作线程执行的任务。假设您实际上想在线程启动时调用该方法,您需要如下所示:
C#2:
Thread t1 = new Thread(delegate() { functionsActivations(3, 4000, 0, 4); });
Run Code Online (Sandbox Code Playgroud)
C#3:
Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
Run Code Online (Sandbox Code Playgroud)
到处使用 lambda 表达式的替代方法是编写一个实用方法:
private static Action DeferFunctionActivations(int a, int b, int c, int d)
{
return () => functionsActivations(a, b, d, d);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用:
Thread t1 = new Thread(DeferFunctionActivations(3, 4000, 0, 4));
Run Code Online (Sandbox Code Playgroud)
ETC。
对于本文的其余部分,我将假设使用 C# 3。
另外,t1.start()应该是t1.Start()- C# 区分大小写。
要回答你的最后一点,t1并且t2当前是独立的 - 它们不会互相阻塞,除非你在它们正在运行的代码中的某个地方进行了同步。
如果您只想在t3和完成时开始 和 ,您可以t4使用:t1t2Thread.Join
Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9));
t3.Start();
t4.Start();
Run Code Online (Sandbox Code Playgroud)
请注意,这意味着该线程也将等待t1并t2完成。如果这对您来说还不够好,有多种选择,但基本上您会想要其他东西来异步等待 t1 和 t2 完成。例如,您可以绑定一个额外的线程来执行此操作:
Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9));
t1.Start();
t2.Start();
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9));
Thread t5 = new Thread(() =>
{
t1.Join();
t2.Join();
t3.Start();
t4.Start();
});
t5.Start();
Run Code Online (Sandbox Code Playgroud)
有点恶心,但应该可以。
你能使用.NET 4.0吗?如果是这样,并行扩展框架会使这一切变得更加容易。