3

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

4

2 回答 2

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 服务,您可以使用该方法通过返回方法中的in并解开方法中的inTask<T>实现异步方法对Task<T>Begin***Task<T>End***

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

请注意,这在 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;
}
于 2013-04-10T23:30:46.703 回答
1

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

于 2013-04-11T03:49:15.260 回答