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