gpt4 book ai didi

c# - Foo().Result 和 Task.Run(() => Foo()).Result 在 C# 中有什么区别?

转载 作者:行者123 更新时间:2023-11-30 20:25:37 25 4
gpt4 key购买 nike

在 C# 中,这两个语句有什么区别?如果我在我的测试类的构造函数中使用第一个,我会遇到死锁或类似的问题,并且测试永远不会完成。对于第二个,代码有效。

// Deadlock.
var r = MyMethod().Result;

// Works.
var r = Task.Run(() => MyMethod()).Result;

更新:此提交中有更多上下文:https://github.com/webCRMdotcom/erp-integrations/pull/92/commits/dd8af89899ce1de837ef6e34f0688a685a5cea3b .

最佳答案

区别在于起始线程上下文。

这里是一个简单的例子

using System;
using System.Threading.Tasks;

public class Program
{
public static void Main()
{
string r;
OutputThreadInfo("Main");
r = MyMethod().Result;
r = Task.Run( () => MyMethod() ).Result;
}

public static async Task<string> MyMethod()
{
OutputThreadInfo("MyMethod");
await Task.Delay(50);
return "finished";
}

private static void OutputThreadInfo(string context)
{
Console.WriteLine("{0} {1}",context,System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}

.net fiddle

输出

Main 32MyMethod 32MyMethod 63

MyMethod 的第一次调用将在与 Main 相同的线程开始,如果从具有同步上下文的线程开始,它将阻塞。

MyMethod 的第二次调用将从与 Main 不同的线程(线程池中的工作线程)开始,它没有同步上下文,因此不会阻塞。

PS 你应该记住,控制台应用程序没有默认的同步上下文,但 WinForms、WPF、UWP 应用程序有,因此在 async/await 上的行为会有所不同

关于c# - Foo().Result 和 Task.Run(() => Foo()).Result 在 C# 中有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51298458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com