相关疑难解决方法(0)

为什么Task.WaitAll()不会阻塞或导致死锁?

在下面的示例中await,使用了两个调用.为了获得性能,样本会被转换Task.WaitAll()(实际上并不是更快,但这只是一个例子).

这是来自Android上使用Sqlite.Net的库中的代码,该方法从OnResume()主UI线程调用:

public async Task SetupDatabaseAsync()
{
  await CreateTableAsync<Session>();
  await CreateTableAsync<Speaker>();
}
Run Code Online (Sandbox Code Playgroud)

这是替代方案:

public void SetupDatabaseAsync()
{
  var t1 = CreateTableAsync<Session>();
  var t2 = CreateTableAsync<Speaker>();

  Task.WaitAll(t1, t2);
}
Run Code Online (Sandbox Code Playgroud)

但是从我的理解Task.WaitAll()应该在等待时阻止UI线程,从而导致死锁.但它的工作正常.那是因为这两个调用实际上并没有在UI线程上调用任何东西吗?

如果我使用它有什么区别Task.WhenAll()?我猜它即使会调用UI线程也能工作,就像使用它一样await.

c# task-parallel-library async-await xamarin

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

标签 统计

async-await ×1

c# ×1

task-parallel-library ×1

xamarin ×1