【问题标题】:Task Results into a Single list任务结果到单个列表中
【发布时间】:2013-04-15 21:46:51
【问题描述】:

我的 WCF 服务中有以下方法:

public List<string> ProcessTask(IEnumerable<string> data)
{             
    var contentTasks = ..........
    List<string> contentWeb = new List<string>();

    Task.Factory.ContinueWhenAll(contentTasks, tasks =>
    {
        foreach (var task in tasks)
        {
            if (task.IsFaulted)
            {
                Trace.TraceError(task.Exception.GetBaseException().Message);
                continue;
            }

            if (task.Result == null || String.IsNullOrEmpty(task.Result.Content))
            {
               continue;
            }

            contentWeb.Add(task.Result.Content);
        }
    });
}

我如何从所有返回具有Result.Content 的字符串列表 任务?这些任务都是异步任务,所以基本上我要等到所有任务都完成后才能返回结果。

【问题讨论】:

  • 不要白提Async的名字!

标签: c# multithreading c#-4.0 task-parallel-library


【解决方案1】:

你应该返回一个Task&lt;List&lt;string&gt;&gt;

public Task<List<string>> ProcessTasksAsync(IEnumerable<string> data)
{
    var contentTasks = ..........
    return Task.Factory.ContinueWhenAll(contentTasks, tasks =>
    {
        var contentWeb = new List<string>(); // Build this in the continuation
        foreach (var task in tasks)
        {
            // ...same code...

            contentWeb.Add(task.Result.Content);

        }
        return contentWeb; // Set the task's result here
    });
}

由于这是一个 WCF 服务,您可以通过在 Begin*** 方法中返回 Task&lt;T&gt; 并在 End*** 方法中解开 Task&lt;T&gt; 来使用 Task&lt;T&gt; 方法到 implement an asynchronous method pair

这使得该方法以适当的方式异步。

请注意,这在 C# 5 中使用 async/await 要容易得多:

public async Task<List<string>> ProcessTasksAsync(IEnumerable<string> data)
{
    var contentTasks = ..........

    await Task.WhenAll(contentTasks);

    var contentWeb = new List<string>(); // Build this in the continuation
    foreach (var task in contentTasks)
    { 
        // ...same code...

        contentWeb.Add(task.Result.Content);
    }

    return contentWeb;
}

【讨论】:

  • 你能在 WCF 中返回一个任务吗?或者我需要另一个调用这个的包装方法
  • @JustinHomes 您可以使用 Task 来进行异步实现(开始/结束方法),尽管它在 C# 4 中充其量是笨重的。4.5/VS2012 的生成器会自动处理 WCF 中的 Task ,不过。
  • 不使用TaskCompletionSource,您可以从lambda返回列表,然后直接返回Task&lt;List&lt;string&gt;&gt;ContinueWhenAll()将返回。
  • @ReedCopsey 退货里面有退货吗?这是链接示例中我的 BeginDoWork 方法,我需要编写一个 EndWork 吗?
【解决方案2】:

我不得不使用 Task.WaitAll(contentTasks); 而不是 continuewhenall;

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多