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

本文关键字:更好 解决方案 方法 异步 实现 | 更新日期: 2023-09-27 18:36:38

我已经阅读了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;
    }

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

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

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

使用

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

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