【问题标题】:Receiving packets in c# using threading在c#中使用线程接收数据包
【发布时间】: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


【解决方案1】:

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

注意:如果您使用 Unity 3.5,它使用支持 .NET 4.0 几乎所有内容的 Mono 2.6.5。我不知道Task 类,但它肯定涵盖了.NET 3.0。

【讨论】:

  • 好的,谢谢,我不确定.NET Unity3D 支持什么版本,我找不到具体信息。我知道它不支持Task 类。至于多线程,我听说有问题,我想我会尝试一下,否则我可能会求助于协程。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多