我正在关注一个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的Unity中使用它,并且仅限于.NET 2.0
编辑2:我改变了一些代码。我意识到ThreadPool有自己的最大限制,如果没有剩下线程,它会排队任务,所以我从我的代码中删除了那个逻辑。
答案 0 :(得分:0)
您真的需要在Unity3D应用程序中使用多线程吗?我问这个是因为Unity“不是”多线程的:有一种方法来处理线程,但你最好依靠 coroutines 来做到这一点。请参阅this documentation以了解有关协同程序的更多信息。
一个注意事项:如果您使用的是Unity 3.5,它使用Mono 2.6.5,它几乎支持.NET 4.0的所有功能。我不知道Task
类,但它肯定涵盖.NET 3.0。
答案 1 :(得分:0)
事实证明我只需要一个线程来监听数据包,所以我不必像上面的例子那样使用线程池。