【发布时间】:2012-08-29 00:11:38
【问题描述】:
我正在关注一个使用 Completion Service 向通过调用接收数据包的 3rd 方应用程序提交查询的 Java 示例:
completionService.submit(new FetchData());
然后它调用:
Future<Data> future = completionService.take();
Data data = future.get(timeout, TimeUnit.MILLISECONDS);
等待提交的任务之一完成并返回数据。这两个调用在while(true) 循环中。
我正在用 c# 开发一个应用程序,我想知道这是否是等待数据包的正确方法,以及我如何在 c# 中这样做。
我已经尝试过了,但我不确定我是否做得对:
new Thread(delegate() {
Dictionary<ManualResetEvent, FetchData> dataDict = new Dictionary<ManualResetEvent, FetchData>();
ManualResetEvent[] doneEvents;
ManualResetEvent doneEvent;
FetchData fetch;
int index;
while(true) {
// Create new fetch
doneEvent = new ManualResetEvent(false);
fetch = new FetchData(this, doneEvent);
// event -> fetch association
dataDict.Add(doneEvent, fetch);
ThreadPool.QueueUserWorkItem(fetch.DoWork);
doneEvents = new ManualResetEvent[dataDict.Count];
dataDict.Keys.CopyTo(doneEvents, 0);
// wait for any of them to finish
index = WaitHandle.WaitAny(doneEvents, receiveThreadTimeout);
// did we timeout?
if (index == WaitHandle.WaitTimeout) {
continue;
}
// grab done event
doneEvent = doneEvents[index];
// grab fetch
fetch = dataDict[doneEvent];
// remove from dict
dataDict.Remove(doneEvent);
// process data
processData(fetch.GetData());
}
}).Start();
编辑:最后一点,我在使用 Mono 2.6 且仅限于 .NET 2.0 的 Unity 中使用它
编辑 2:我更改了一些代码。我意识到 ThreadPool 有自己的最大限制,如果没有剩余线程,线程池会将任务排队,因此我从代码中删除了该逻辑。
【问题讨论】:
-
使用
Task类和 TPL。这要容易得多。 -
抱歉忘了提到我使用的是 Unity,这意味着我不能使用任何 .NET 4.0 的东西
-
标签 unity 用于 Microsoft Unity。请不要滥用它。
标签: c# java multithreading unity3d