误解async/await函数

bub*_*net 3 .net c# asynchronous async-await

我使用C#/ VS2012/.Net4.0/Microsoft.Bcl.async NuGet包

在之前的问题之后,我尝试使用async/await来避免冻结UI.但是我的每个测试都没有成功.

执行繁重工作的主要功能是这样的:

public bool PopulateTV()
{
  using (WaitingForm waitingForm=new WaitingForm())
  {
    waitingForm.Show();
    bool boolResult=DoHeavyWork(); //UI is freezing, waitingForm() doesn't show correctly
    return boolResult;
  }
}
Run Code Online (Sandbox Code Playgroud)

对此功能的调用就像

if(!PopulateTV())
{
}
Run Code Online (Sandbox Code Playgroud)

我尝试实现async/await

public async Task<bool> populateTV()
{
  using (WaitingForm waitingForm=new WaitingForm())
  {
    Task<bool> func=DoHeavyWork();
    bool boolResult=await func;
    return boolResult;
  }
}

public Task<bool> DoHeavyWork()
{
  //do the work
  return boolResult;
}
Run Code Online (Sandbox Code Playgroud)

当然,我得到一个错误DoHeavyWork,因为我返回a bool而不是Task<bool>.所以我改变了DoHeavyWork功能:

public async Task<bool> DoHeavyWork()
{
  //do the work
  return boolResult;
}
Run Code Online (Sandbox Code Playgroud)

这一次,没有错误,但是警告(我使用非英文版的VS,所以我翻译了错误/警告信息):

此异步方法没有await运算符,因此它将作为同步执行.

这只是一个警告,但为什么我会收到这条消息呢?

但这不是大问题.当我调用父方法PopulateTV()时,我想返回一个bool值(if(!PopulateTV()) ... 而且我收到一个错误:

!运算符不能与'System.Threading.Tasks.Task'一起使用.

当然.但是PopulateTV()返回a bool(return boolResult;),即使方法声明使用Task<bool>.

我的错误在哪里?

fk2*_*fk2 6

你实际上并没有在一个单独的线程中运行繁重的代码 - 异步并不能自动保证这一点.

尝试类似的东西 (await Task.Run(() => DoHeavyWork()));