我已经阅读了Stephen Toub's article和Stephen Cleary's post,但我仍然不清楚如何最好地实现异步方法,即轮询邮件服务器。
从我理解的文章中我喜欢优化卸载(不阻止UI线程)和可伸缩性(使用最少量的资源)。现在我最终认为使用Task.Delay
是最好的方法。但是,我不确定。将TaskCompletionSource
与计时器结合使用是更好的解决方案吗?还有其他解决方案吗?
这是我到目前为止所做的:
private async Task<int> WaitForMessages()
{
int messageCount = popClient.GetMessageCount();
while (messageCount == 0)
{
await Task.Delay(1000);
messageCount = popClient.GetMessageCount();
}
return messageCount;
}
PS:我知道,取消和超时仍然缺失。
答案 0 :(得分:6)
Task.Delay
本身基本上是TaskCompletionSource
,Timer
。自己重新创建它是没有意义的。
使用Task.Delay
非常适合使用异步等待轮询。
但是,另一方通知您的异步API更好,因为您不需要轮询开始。如果您可以控制popClient
,则可能需要考虑完全更改API。