【问题标题】:How to get data from Task after running Task.WhenAll(taks)运行 Task.WhenAll(tasks) 后如何从 Task 获取数据
【发布时间】:2019-03-04 16:18:16
【问题描述】:

我有多个 Async 方法可以一个一个运行,但是当我使用 Task.WhenAll 时,我真的不知道如何得到结果。以下是我的异步方法

    public async Task<IEnumerable<MyModel>> Method1Async()
    {
        return await Task<IEnumerable<MyModel>>.Run<IEnumerable<MyModel>>(() => GetMethod1Data());
    }
    //Here Method1Async().Result will get me the data but don't know how to get the result when I am using Task.WhenAll() 

    public async Task<IEnumerable<MyModel>> Method2Async()
    {
        return await Task<IEnumerable<MyModel>>.Run<IEnumerable<MyModel>>(() => GetMethod2Data());
    }

    public async Task<IEnumerable<MyModel>> Method3Async()
    {
        return await Task<IEnumerable<MyModel>>.Run<IEnumerable<MyModel>>(() => GetMethod3Data());
    }

这是我使用 Task.WhenAll 的代码

    public async Task GetDataAsync()
    {
        Task[] tasks = new Task[3];

        tasks[0] = Method1Async();
        tasks[1] = Method2Async();
        tasks[2] = Method2Async();

        await Task.WhenAll(tasks).ConfigureAwait(false);
    }

现在如果我打电话

GetDataAsync()

方法,一切正常,但不知道如何从返回的任务中获取结果?

【问题讨论】:

  • 它将是Array[IEnumerable&lt;MYModel&gt;]
  • 顺便说一句,RunTask 上的静态方法。无需使用Task&lt;T&gt;.Run。并且应该推断Run 的参数。只需Task.Run(() =&gt; GetMethod1Data()) 即可。

标签: c# asynchronous


【解决方案1】:

它将返回一个IEnumerable&lt;MyModel&gt; 类型的数组,因此您可以将异步方法的返回类型设置为:

public Task<IEnumerable<MyModel>[]> GetDataAsync()
{
    Task[] tasks = new Task[3];

    tasks[0] = staticDataService.Method1Async();
    tasks[1] = staticDataService.Method2Async();
    tasks[2] = staticDataService.Method3Async();

    return Task.WhenAll(tasks);
}

然后消费它:

IEnumerable<MyModel>[] results = await GetDataAsync();

【讨论】:

  • 您需要退货,return await ...
  • 感谢@Nkosi 修复它,是的,显然我们不需要在这种情况下使用Task.WhenAll 使其异步
  • 感谢 Charles、NKosi 和 Ehsan 的回复。如果调用者方法不是异步方法,请有人告诉我将如何调用 GetDataAsync()
  • @LearningCurve IEnumerable&lt;MyModel&gt;[] results = GetDataAsync().Result; 就是这样
  • 或者如果消费者需要同步调用该方法,则该方法不应该是异步的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
相关资源
最近更新 更多