C#中如何处理多个异步方法调用

What to deal with multiple asynchronous method invocations in C#

假设,我有一个简单的 class,其中包含异步方法:

public class Writer
{
    public Task WriteAsync(string message);
}

这是内部的class,这对于应用程序的业务逻辑来说绝对可以忽略不计。

该方法的主要思想是,当它被调用时 - 方法必须立即 returns 控制调用方法 ,以避免任何可能的重要延迟,充满业务逻辑调用方法(当然可以延迟调用该方法)。

这个方法经常在不同的地方调用。我们真的不在乎它是否成功,或者在出现意外情况时不会写最后的消息。没关系。

所以,问题是,我怎样才能调用 WriteAsync 以避免在调用方法时出现任何可能的延迟

我考虑过 Task.Run(() => WriteAsync(message))(没有 await!我们不需要等待这个!),但这不会让我的线程池充满大量无用的工作吗?而且到处写这样的代码是相当繁重的...

您可以将写入排队并处理队列,即在专用后台线程上执行写入。这就是您调用 Task.Run 时发生的情况,即您在线程池中排队委托。如果你需要更多的控制,你可以使用 BlockingCollection<T>.

有一个示例说明如何使用 BlockingCollection<T> 读取和写入 MSDN 上同时可用的项目。

使用这种方法,调用 WriteAsync 只会阻塞将消息添加到队列所需的时间,这个时间应该可以忽略不计。

因为该方法是异步的,根据定义,它已经 return立即将控制权交给调用者。如果该方法的实现实际上不是异步的,那么它不应该 return a Task,名称中不包含 Async,并让调用者清楚它是同步的,或者它应该 修复其实现中的错误 导致它长时间阻塞调用者。该方法的调用者理所当然地期望,作为一个异步方法,它会 return 通过正常调用该方法 立即 控制调用者。如果该方法中存在使其无法执行此操作的错误,则您不应该解决该错误并让调用者将其视为同步方法,而实际上它声称它不是同步方法。