我刚刚开始在异步编程中蘸我的脚趾。我试着阅读很多关于Task.Run的内容,但我不清楚一个问题。
如果我有两个连续的语句使用Task.Run,没有等待,那两个会并行运行吗?
代码示例:
Task.Run(()=> function1);
Task.Run(()=> function2);
因为我想要一个非阻塞调用,所以Parallel.Invoke不是一个选项。我也不想等待上下文,所以等待Task.Run是没有意义的。这是一个很好的解决方法吗?
答案 0 :(得分:2)
它们可能并行运行,是的。
当然,这假设有资源允许它们并行运行 - 例如,你有足够的免费线程池线程,你有多个执行单元,它们不会在同一个I / O上阻塞...
请注意,即使您没有等待这些任务,保持Task
引用通常很有用 - 例如用于错误处理,完成通知等。纯粹的火灾和遗忘操作相当罕见。
答案 1 :(得分:0)
static void Main(string[] args)
{
Task.Run(() => function1());
Task.Run(() => function2());
}
private static void function2()
{
//throw new NotImplementedException();
}
private static void function1()
{
while (true)
{
}
}
只需使用断点运行此代码,您将看到两个方法将异步运行。但这一切都取决于ThreadPool调度。
答案 2 :(得分:-1)
这个问题没有正确答案。当您调用Task.Run(..)
时 - 您将操作传递给具有自己的调度程序的线程池。该调度程序将决定何时运行您的操作。因此,它可以并行运行几个,但有时不会。如果你真的想要运行并行的东西,你应该使用Thread
或像Parallel Extensions这样的东西。
更新。要启动单独的帖子,您可以使用
var thread = new Thread((() => { /*...*/ }));
thread.Start();
BUT!请注意,对于短时操作以及必须运行许多任务时 - 使用线程并不是一个好的选择。在那种情况下Task.Run
- 会更好。通常,我建议仅将Threads用于长时间运行的计算操作。