gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:09:56 26 4
gpt4 key购买 nike

我正在遵循一个 Java 示例,该示例使用完成服务将查询提交给通过调用接收数据包的第 3 方应用程序:

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();

编辑:最后一点,我在 Unity 中使用它,它使用 Mono 2.6 并且仅限于 .NET 2.0

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

最佳答案

您真的需要在 Unity3D 应用程序中使用多线程吗?我问这个问题是因为 Unity“不是”多线程:有一种方法可以处理线程,但您最好依靠协程来完成此操作。请引用this documentation查找有关协程的更多信息。

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

关于c# - 使用线程在 C# 中接收数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12169257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com