【发布时间】:2019-05-12 15:23:32
【问题描述】:
假设,我有一个简单的类,里面有异步方法:
public class Writer
{
public Task WriteAsync(string message);
}
这是内部类,对于应用程序的业务逻辑来说绝对可以忽略不计。
方法的主要思想,就是当它被调用时——方法必须立即将控制权交还给调用方法,避免在重要的、充满业务逻辑的调用方法中出现任何可能的延迟(延迟为当然可以调用该方法)。
这个方法经常在不同的地方调用。我们并不关心它是否成功,或者在出现意外情况时不会写最后一条消息。没关系。
所以,问题是,我怎样才能调用WriteAsync 以避免调用方法中可能出现的任何延迟?
我想过Task.Run(() => WriteAsync(message))(没有await!我们不需要等待这个!),但这不会让我的线程池充满大量无用的工作吗?而且到处写这样的代码是相当繁重的......
【问题讨论】:
-
如果方法的作用是无用的,如果方法成功与否都无关紧要......为什么要拥有它?
-
从这个意义上说,任务非常轻,除非实现本身很重,如果您关心如何触发和忘记任务,只需创建一个运行 Task.Run(() 的 void 方法=> WriteAsync(message))...,但是就像大卫说的那样,如果那个主线程被终止,任务就会被终止,那么,你真的需要这个吗?
-
如果它真的“无用”,那么就不要这样做:) 但是如果你想让它运行,那么你别无选择,只能花费处理能力去做。您想要的通常称为“一劳永逸”(在后台运行并忽略它)。请记住a Task doesn't necessarily run on its own thread,尽管它可能会。
-
@David 这是一个特殊的方法,最初是给
InfluxDb添加指标,只是一个简单的例子。
标签: c# multithreading task threadpool