激活线程C#
问题描述:
我有这样的代码在C#:激活线程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));
这是行不通的。我怎么能告诉它调用我给它的方法? 其次,我想t3和t4在t1和t2完成运行后激活。我怎样才能做到这一点? 第三,我希望t1和t2不会阻塞(这样t2就不必等到t1结束)。我做的是对的吗?
答
“这不起作用”并不是一组非常明显的症状。你在观察什么?
编辑:好的,现在你已经说过编译器错误是什么,它更容易诊断。您当前正在调用一个方法并尝试将结果用作要执行的线程的任务。假设你实际上要作出这样的方法调用,当线程启动,你想是这样的:
C#2:
Thread t1 = new Thread(delegate() { functionsActivations(3, 4000, 0, 4); });
C#3:
Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
的altnerative到在所有地方有lambda表达式将是写实用方法:
private static Action DeferFunctionActivations(int a, int b, int c, int d)
{
return() => functionsActivations(a, b, d, d);
}
然后,你可以使用:
Thread t1 = new Thread(DeferFunctionActivations(3, 4000, 0, 4));
等
对于帖子的余下部分我假设C#3
此外,t1.start()
应该是t1.Start()
- C#是区分大小写的。
要回答你的最后一点,t1
和t2
目前是独立的 - 它们不会互相阻塞,除非你在他们正在运行的代码的某个地方进行了同步。
如果你只是想t3
和t4
时t1
和t2
已经完成启动,你可以使用Thread.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();
注意,这意味着这线程将等到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();
有点恶心,但它应该工作。
你能够使用.NET 4.0吗?如果是这样的话,并行扩展框架使得这很容易。
哦,我不知道... – aharon 2010-02-12 13:14:23
Yea队友,2/11接受不好。仔细检查这些问题,并将那些回答您的情况的问题标记为已接受。 – 2010-02-12 13:15:46