我发现自己经常需要编写长时间运行的异步方法,例如轮询循环。这些方法可能会像这样:
private async Task PollLoop()
{
while (this.KeepPolling)
{
var response = await someHttpClient.GetAsync(...).ConfigureAwait(false);
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
// do something with content
await Task.Delay(timeBetweenPolls).ConfigureAwait(false);
}
}
使用异步编程的目的是为了不需要专门的轮询线程,而且使用它实现的逻辑(在我看来)比直接使用定时器更容易理解(此外,还不必担心重新进入问题)。
我的问题是,在同步上下文中启动这样的循环的首选方法是什么?我可以想到至少两种方法:
var pollingTask = Task.Run(async () => await this.PollLoop());
// or
var pollingTask = this.PollLoop();
无论哪种情况,我都可以使用ContinueWith()来响应异常。我对这两种方法的主要理解是,第一种方法最初会在线程池线程上开始循环,而第二种方法将在当前线程上运行,直到第一个await。这是真的吗?还有其他需要考虑或尝试的更好方法吗?
Task.Run
2) 由编译器生成的await
3) PollLoop本身。另一方面,第二个只有1个任务。 - I4VTask.Run(() => this.PollLoop().Wait())
- I4VTask.Run
。 - noseratio - open to workawait Task.Delay(10);
。 - Rui Caramalho