在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);
}
}
将输出
主要32 MyMethod 32 MyMethod 63
MyMethod的第一次调用将在与Main相同的线程处开始,如果从具有同步上下文的线程开始,它将被阻止。
MyMethod的第二次调用将从与Main不同的线程(线程池中的工作线程)开始,该线程没有同步上下文,因此不会阻塞。
PS:请记住,控制台应用程序没有默认的同步上下文,但WinForms,WPF,UWP应用程序确实具有同步上下文,因此在异步/等待时的行为会有所不同
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句