我是否可以连续调用多个异步方法?

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)

我做得对吗?

Ser*_*rvy 9

不.您不需要,也不想启动新线程只是为了负责启动这两个异步操作.只需启动这两个操作(调用方法就是启动操作的方法)并且在你启动它们之前不要等待:

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)