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

时间:2012-08-29 00:11:38

标签: c# java multithreading unity3d

我正在关注一个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有自己的最大限制,如果没有剩下线程,它会排队任务,所以我从我的代码中删除了那个逻辑。

2 个答案:

答案 0 :(得分:0)

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

一个注意事项:如果您使用的是Unity 3.5,它使用Mono 2.6.5,它几乎支持.NET 4.0的所有功能。我不知道Task类,但它肯定涵盖.NET 3.0。

答案 1 :(得分:0)

事实证明我只需要一个线程来监听数据包,所以我不必像上面的例子那样使用线程池。