与 Task.FromResult(0) 异步等待

cry*_*ted 4 c# async-await

不确定我是否对 async await 如何工作的理解感到困惑,但这是我遇到的问题。考虑一个人为的例子

  1. 此代码块 UI

    public async void LoginButtonClicked()
    {
     //create a continuation point so every following statement will get executed as ContinueWith
     await Task.FromResult(0);
     //this call takes time to execute
     Remote.Login("user","password");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 但这并没有(显然)

     public void LoginButtonClicked()
     {
     Task.Run(()=>{ Remote.Login("user","password");});
      }
    
    Run Code Online (Sandbox Code Playgroud)

我喜欢使用方法 1,因为我不想使用 Task.Run 进行长时间的工作,而我更喜欢框架处理这种形式。但问题是对方法 1 的调用似乎阻塞了。

Nic*_*s W 5

如果您调用的所有长时间运行的操作都是异步的,则使用 await/async 只会阻止您阻止 UI。在您的示例中,您Remote.Login是一个同步调用,因此无论前await一行做什么,这都会阻止您的 UI。

您需要获取实际长期运行操作的异步版本(例如返回 a 的内容Task),或者如果不可能,那么您可以求助于Task.Run将这项工作移至ThreadPool.

如果可能,你想要什么:

public async void LoginButtonClicked()
{
    await Remote.LoginAsync("user","password");
    // do anything else required
}
Run Code Online (Sandbox Code Playgroud)