【发布时间】:2018-02-28 17:57:52
【问题描述】:
我们在网络角色中有一些工作线程。它是在OnStart 方法中创建的
Task.Factory.StartNew(() => DoWorkAsync(), TaskCreationOptions.LongRunning);
然后DoWorkAsync 方法将继续轮询队列并做一些耗时的工作。实际工作需要几分钟,因为它提交查询作业并等待结果返回。这些函数采用async 模式。实现顶级DoWorkAsync 方法的正确方法是什么?如果我执行以下操作,那么这里有点阻塞,并且只调用了一个PollingQueueAndWorkAsync()。
public async void DoWorkAsync()
{
while (_continue)
{
await PollingQueueAndWorkAsync();
}
}
还是以下?它看起来不正确,因为它一直在不同的线程中运行该方法。
public async void DoWorkAsync()
{
while (_continue)
{
Task.Run(() => PollingQueueAndWorkAsync());
}
}
我正在尝试将代码重构为“一直异步”。但是在顶级worker方法中应该如何结束呢?
[更新]
在尝试更多之后,这是我所拥有的:
public async void DoWorkAsync()
{
while (_continue)
{
Task.Run(async () => await PollingQueueAndWorkAsync());
}
}
行为是我想要的,因为新消息不断添加到队列中,这个循环可以处理队列中的消息。然而,在运行一段时间后,它会抛出我们的内存异常。是因为它创造了太多的延续吗?所以我应该使用 SemaphoreSlim 来限制任务数量?
【问题讨论】:
-
如果你想全面了解 async/await,我建议从这里开始:blogs.msdn.com/b/pfxteam/archive/2012/04/12/…
标签: c# multithreading asynchronous task-parallel-library async-await