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

Jan*_*zki 3 c# asynchronous async-await

我已经阅读了Stephen Toub的文章Stephen Cleary的帖子,但我仍然不清楚如何最好地实现异步方法,即轮询邮件服务器.

根据我从那些文章中理解,我喜欢优化卸载(不阻止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;
    }
Run Code Online (Sandbox Code Playgroud)

PS:我知道,取消和超时仍然缺失.

i3a*_*non 6

Task.Delay本身基本上是TaskCompletionSource一个Timer.自己重新创建它是没有意义的.

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

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