geo*_*eci 1 c# asynchronous async-await
在启动期间,我需要获取两组数据的应用程序,每个数据都有其异步方法.如果我逐个调用它们,那么第二个调用只有在完成第一个调用后才会通过.
List<DataOne> DataCollectionOne;
List<DataTwo> DataCollectionTwo;
async void GetDatas()
{
if(sameCondOne)
DataCollectionOne = await GetDataOne();
if(sameCondTwo)
DataCollectionTwo = await GetDataTwo();
}
Run Code Online (Sandbox Code Playgroud)
所以我把它们包装在任务调用中.
void GetDatas()
{
if(sameCondOne)
Task.Run(() => RunDataOne());
if(sameCondTwo)
Task.Run(() => RunDataTwo());
}
async void RunDataOne()
{
DataCollectionOne = await GetDataOne();
}
async void RunDataTwo()
{
DataCollectionTwo = await GetDataTwo();
}
Run Code Online (Sandbox Code Playgroud)
我做得对吗?
不.您不需要,也不想启动新线程只是为了负责启动这两个异步操作.只需启动这两个操作(调用方法就是启动操作的方法)并且在你启动它们之前不要等待:
var firstTask = GetDataOne();
var secondTask = GetDataTwo();
var firstResult = await firstTask;
var secondResult = await secondTask;
Run Code Online (Sandbox Code Playgroud)
要处理条件检查,只需有条件地启动任务,然后有条件地分配结果:
Task<T> firstTask = null;
if(shouldGetFirstTask)
firstTask = GetDataOne();
Task<T> secondTask = null;
if(shouldGetSecondTask)
secondTask = GetDataTwo();
if(firstTask != null)
DataCollectionOne = await firstTask;
if(secondTask != null)
DataCollectionTwo = await secondTask;
Run Code Online (Sandbox Code Playgroud)