我最近遇到了这个由我们为我们工作的承包商编写的代码.它要么是非常聪明或愚蠢(我认为后者,但我想要第二个意见).我没有大规模的速度async await.
基本上它的工作方式如下:
public bool Send(TemplatedMessageDto message)
{
return Task.Run(() => SendAsync(message))
.GetAwaiter()
.GetResult();
}
public async Task<bool> SendAsync(TemplatedMessageDto message)
{
//code doing stuff
var results = await _externalresource.DothingsExternally();
//code doing stuff
}
Run Code Online (Sandbox Code Playgroud)
据我所知,首先Task.Run()是无意义和低效的?应该是:
public bool Send(TemplatedMessageDto message)
{
return SendAsync(message))
.GetAwaiter()
.GetResult();
}
public async Task<bool> SendAsync(TemplatedMessageDto message)
{
//code doing stuff
var results = await _externalresource.DothingsExternally();
//code doing stuff
}
Run Code Online (Sandbox Code Playgroud)
我也不相信这实际上是一种异步方法,因为它仍然会等待,对吧?我认为唯一的优势(甚至是重写)就是释放主要的工作者线程.
有人可以确认第一个任务不应该存在吗?
c# multithreading asynchronous task-parallel-library async-await
众所周知,在UI线程中访问Task的Result属性,同步模式会发生死锁。
理论上,后续代码会死锁,但不会。你能解释一下为什么吗?
// My "library" method.
public static async Task<JObject> GetJsonAsync(Uri uri)
{
using (var client = new HttpClient())
{
var jsonString = await client.GetStringAsync(uri);
return JObject.Parse(jsonString);
}
}
//MVC action
public ActionResult Index()
{
var result = System.Threading.Tasks.Task.Run(async () => await GetJsonAsync(...)).Result; // deadlock is expectation but not :(
...
}
Run Code Online (Sandbox Code Playgroud)
我认为这在某种程度上System.Threading.Tasks.Task.Run(async () => await GetJsonAsync(...)).Result是相似的,但事实并非如此。GetJsonAsync(...).Result
GetJsonAsync(...)).Result会陷入僵局,但System.Threading.Tasks.Task.Run(async () => await GetJsonAsync(...)).Result事实并非如此。