C# 7.0 独立丢弃混淆 | _ = FooTask() 和 _ = Task.Run(FooTask) 的区别

Dom*_*nas 0 c# asynchronous c#-7.0

我有一个Task FooTask应该在后台调用的。中的一个新功能C# 7.0discard函数。正如已经问过的(C# 7.0 独立丢弃混淆),可以通过Task两种方式调用。但是,我还没有能够确切地找出这两个调用有何不同以及它们是否有任何区别。

_ = Task.Run(FooTask);
Run Code Online (Sandbox Code Playgroud)
_ = FooTask();
Run Code Online (Sandbox Code Playgroud)

Joh*_*lay 7

丢弃在这里没有任何区别;您的代码与以下内容相同:

Task.Run(FooTask);
Run Code Online (Sandbox Code Playgroud)
FooTask();
Run Code Online (Sandbox Code Playgroud)

甚至生成的 IL 也是相同的。

丢弃只是明确表明Task任何进一步的过程都不需要返回的值。

但是,我还没有能够确切地找出这两个调用有何不同以及它们是否有任何不同

不同之处在于使用Task.Runwhich FooTaskforce 在 ThreadPool 线程上运行。

没有Task.Run,FooTask将在当前线程上运行,直到安排了延续,并且该延续恢复的线程由同步上下文确定。