使用线程在c#中接收数据包

使用线程在c#中接收数据包,c#,java,multithreading,unity3d,C#,Java,Multithreading,Unity3d,下面是一个Java示例,它使用完成服务向通过调用接收数据包的第三方应用程序提交查询: completionService.submit(新的FetchData()); 然后它呼吁: Future=completionService.take(); Data Data=future.get(超时,时间单位为毫秒); 它等待一个提交的任务完成并返回数据。这两个调用位于while(true)循环中 我正在用c#开发一个应用程序,我想知道这是否是等待数据包的正确方法,以及我如何在c#中完成它 我已经

下面是一个Java示例,它使用完成服务向通过调用接收数据包的第三方应用程序提交查询:

completionService.submit(新的FetchData());
然后它呼吁:

Future=completionService.take();
Data Data=future.get(超时,时间单位为毫秒);
它等待一个提交的任务完成并返回数据。这两个调用位于
while(true)
循环中

我正在用c#开发一个应用程序,我想知道这是否是等待数据包的正确方法,以及我如何在c#中完成它

我已经试过了,但我不确定我是否做对了:

新线程(委托(){
Dictionary dataDict=新字典();
ManualResetEvent[]DoneeEvents;
手动重置事件不发生事件;
获取数据获取;
整数指数;
虽然(正确){
//创建新获取
doneEvent=新手动重置事件(假);
fetch=新的FetchData(this,doneEvent);
//事件->获取关联
添加(doneEvent,fetch);
ThreadPool.QueueUserWorkItem(fetch.DoWork);
doneEvents=新的手动重置事件[dataDict.Count];
dataDict.Keys.CopyTo(doneEvents,0);
//等待他们中的任何一个完成
index=WaitHandle.WaitAny(doneEvents,receiveThreadTimeout);
//我们暂停了吗?
if(index==WaitHandle.WaitTimeout){
持续
}
//抓取完成事件
doneEvent=doneEvents[索引];
//抓取
fetch=dataDict[doneEvent];
//从口述中删除
数据目录删除(doneEvent);
//过程数据
processData(fetch.GetData());
}
}).Start();
编辑:最后一点,我在Unity中使用它,它使用Mono 2.6,仅限于.NET 2.0


编辑2:我更改了一些代码。我意识到线程池有它自己的最大限制,如果没有剩余的线程,它会对任务进行排队,因此我从代码中删除了该逻辑。

你真的需要在Unity3D应用程序中使用多线程吗?我这样问是因为Unity“不是”多线程:有一种处理线程的方法,但您最好依靠协同程序来实现这一点。请参阅以查找有关协同程序的更多信息


注意:如果您使用的是Unity 3.5,那么它使用的是Mono 2.6.5,它几乎支持.NET 4.0的所有功能。我不知道
任务
类,但它肯定涵盖了.NET3.0

事实证明,我只需要一个线程来侦听数据包,因此我不必像上面的示例那样使用线程池。

使用
任务
类和TPL。这要简单得多。很抱歉,我忘了提到我使用的是Unity,这意味着我不能使用任何.NET 4.0产品。Unity标签是针对Microsoft Unity的。请不要误用它。好的,谢谢,我对.NET Unity3D支持的版本没有把握,我无法找到具体的信息。我知道它不支持
任务
类。至于多线程,我听说有问题,我想我应该尝试一下,否则我可能会回到协同程序上来。