在下面的示例中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.