任务结果进入单个列表

时间:2013-04-10 23:25:58

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

我的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的字符串列表 任务?这些任务是异步任务,所以基本上我必须等到所有任务完成后再返回结果。

2 个答案:

答案 0 :(得分:3)

您应该返回Task<List<string>>

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服务,您可以使用Task<T>方法Task<T>方法返回Begin***方法中的Task<T>,然后展开End***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; } 的C#5会更容易:

{{1}}

答案 1 :(得分:1)

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