相关疑难解决方法(0)

使用Task.Run调用异步方法似乎错了?

我最近遇到了这个由我们为我们工作的承包商编写的代码.它要么是非常聪明或愚蠢(我认为后者,但我想要第二个意见).我没有大规模的速度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

11
推荐指数
2
解决办法
1757
查看次数

为什么同步方式访问Task.Result不会出现死锁?

众所周知,在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事实并非如此。

c# deadlock async-await

1
推荐指数
1
解决办法
564
查看次数