【问题标题】:C# 7.0 standalone discard confusion | difference between _ = FooTask() and _ = Task.Run(FooTask)C# 7.0 独立丢弃混淆 | _ = FooTask() 和 _ = Task.Run(FooTask) 之间的区别
【发布时间】:2021-02-24 09:28:58
【问题描述】:

我有一个 Task FooTask 应该在后台调用。 C# 7.0 中的一个新特性是 discard 函数。如前所述(C# 7.0 standalone discard confusion),可以通过两种方式调用Task。但是,我还不能确切地找出这两个调用有何不同以及它们是否有任何不同。

_ = Task.Run(FooTask);
_ = FooTask();

【问题讨论】:

    标签: c# asynchronous c#-7.0


    【解决方案1】:

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

    Task.Run(FooTask);
    
    FooTask();
    

    即使生成的 IL 也是一样的。

    丢弃只是明确表明返回的Task 不需要任何进一步的处理。

    但是,我还不能确切地知道这两个调用有何不同,以及它们是否完全不同

    不同之处在于Task.Run 的使用会强制FooTask 在线程池线程上运行。

    如果没有Task.RunFooTask 将在当前线程上运行,直到安排了延续,而延续该延续的线程由同步上下文确定。

    【讨论】:

    • 关于垃圾收集的部分有点混乱。丢弃在代码中明确表明您(开发人员)不关心返回值。正如您自己所说 - IL 是相同的,因此它与垃圾收集没有任何影响或关系。
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多