激活线程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结束)。我做的是对的吗?

+0

哦,我不知道... – aharon 2010-02-12 13:14:23

+2

Yea队友,2/11接受不好。仔细检查这些问题,并将那些回答您的情况的问题标记为已接受。 – 2010-02-12 13:15:46

“这不起作用”并不是一组非常明显的症状。你在观察什么?

编辑:好的,现在你已经说过编译器错误是什么,它更容易诊断。您当前正在调用一个方法并尝试将结果用作要执行的线程的任务。假设你实际上要作出这样的方法调用,当线程启动,你想是这样的:

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#是区分大小写的。

要回答你的最后一点,t1t2目前是独立的 - 它们不会互相阻塞,除非你在他们正在运行的代码的某个地方进行了同步。

如果你只是想t3t4t1t2已经完成启动,你可以使用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(); 

注意,这意味着线程将等到t1t2已经完成,太。如果这对你来说不够好,有很多选择,但基本上你会想要别的东西来异步等待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吗?如果是这样的话,并行扩展框架使得这很容易。

+0

谢谢!你解决了我最后两个问题,但不是第一个问题。 它不是由于其他原因而起作用,问题在于我给出的线程函数。它告诉我,他不能从void转换到system.threading.threadstart ... – aharon 2010-02-12 13:24:23

+0

为什么你要传递一个构造函数给线程?你想做什么?在线程中创建一个对象,因为构建需要很长时间? – Dave 2010-02-12 13:33:29

+0

不,代码是在ctor中,我通过线程 – aharon 2010-02-12 13:38:18