实现异步轮询方法的更好解决方案?

时间:2016-02-27 01:59:37

标签: c# asynchronous async-await

我已经阅读了Stephen Toub's articleStephen 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:我知道,取消和超时仍然缺失。

1 个答案:

答案 0 :(得分:6)

Task.Delay本身基本上是TaskCompletionSourceTimer。自己重新创建它是没有意义的。

使用Task.Delay非常适合使用异步等待轮询。

但是,另一方通知您的异步API更好,因为您不需要轮询开始。如果您可以控制popClient,则可能需要考虑完全更改API。