【发布时间】:2016-12-21 20:07:04
【问题描述】:
我想从一个游戏循环开始在后台工作,应该一个接一个地执行,但不应该阻塞游戏循环。
所以理想情况下可以像这样使用一个类BackgroundQueue:
BackgroundQueue myQueue = new BackgroundQueue();
//game loop called 60 times per second
void Update()
{
if (somethingHappens)
{
myQueue.Enqueue(() => MethodThatTakesLong(someArguments))
}
}
.NET 中是否有适用于该场景的现成类?或者有人知道如何实现BackgroundQueue 类的好例子吗?
如果该类可以报告它当前是否正在做某事以及有多少代表在排队,那就太好了......
【问题讨论】:
-
和ConcurrentQueue一起看BlockingCollection,例子很多。启动一个从 BlockingCollection 消费的线程,并从你的主循环中启动项目。
-
Task
如果您希望您的委托按顺序执行,则自定义 TaskScheduler 可能会起到作用。有关如何构建自定义 TaskScheduler 的信息,请参阅 infoworld.com/article/3063560/application-development/…。如果您不介意您的委托被并行执行,那么标准的 .NET TaskScheduler 可能就可以了。 -
考虑将所有内容都放在一个线程上,并使用 async-await 来构建异步工作流。请记住,异步不是并发。您可以在一个线程上执行所有异步工作流,就像您可以同时煮鸡蛋和吐司而无需雇用两名厨师。
-
因为它是一个高性能应用程序,CPU 负载将是一个非常关键的因素,因此在另一个线程上执行委托非常重要。但据我了解,如果使用异步/任务模式,标准.NET 调度程序将在当前线程处于限制状态时执行此操作。所以也许用 task.ContinueWith 建立一个队列可能是一种选择。我在这里找到了一个例子:stackoverflow.com/a/15120092/355485
标签: c# .net multithreading task backgroundworker