我一直在开发一个自定义多线程服务器,它使用HTTP与客户端进行通信。为了创建新线程,我一直在使用Task.Factory.StartNew()方法。对于同步,我一直在使用ManualResetEvent对象。
下面是代码的本质:
namespace ThreadTest {
class Program {
private readonly ManualResetEvent _event = new ManualResetEvent(false);
public void Start() {
for (int i = 0; i < 100; i++) {
int num = i;
Task.Factory.StartNew(() => {
Console.WriteLine("Task {0} Started", num);
_event.WaitOne();
});
}
}
static void Main(string[] args) {
var test = new Program();
test.Start();
Console.ReadLine();
}
}
}在真正的代码中,_event对象最终会被Set调用以释放等待的任务。
我遇到的问题是,这段代码在我的开发机器上工作得很好(它是双核的,每个内核有两个线程,使用MS .NET 4运行时),但是不能在我的服务器上工作(它是单个内核,每个内核有一个线程,使用Mono2.8运行时)。我的开发机器上的输出是:
Task 0 Started
Task 1 Started
Task 3 Started
Task 2 Started
Task 4 Started
Task 5 Started
...而服务器输出是
Task 53 Started我的问题是:我对ManualResetEvent或任务有什么误解?为什么TaskFactory继续在双核而不是单核上执行任务?
更新:
我刚在我的双核(每个内核一个线程) mac笔记本电脑上试了一下,我得到了输出。
Task 97 Started
Task 1 Started然后什么都没有。我还在我的开发机器(4个线程)上试用了Mono,得到了:
Task 99 Started
Task 2 Started
Task 98 Started
Task 0 Started所以它看起来就像一只带有Mono的虫子。
发布于 2011-04-26 20:05:53
原来是Mono的一个窃听器。我是提交一份报告,现在已经修好了。
https://stackoverflow.com/questions/4986866
复制相似问题