从异步方法向StringBuilder添加字符串

11

我有一个异步方法,它会返回一个字符串(来自Web)。

async Task<string> GetMyDataAsync(int dataId);

我有:

Task<string>[] tasks = new Task<string>[max];
for (int i = 0; i < max; i++)
{
    tasks[i] = GetMyDataAsync(i);
}

我该如何将每个任务的结果追加到 StringBuilder 中?

我想知道如何做到:

A) 按照任务创建的顺序

B) 按照任务完成的顺序

我该怎么做?

1个回答

15
按任务创建的顺序排序
Task<string>[] tasks = new Task<string>()[max];
for (int i = 0; i < max; i++)
{
    tasks[i] = GetMyDataAsync(i);
}
Task.WaitAll(tasks);
foreach(var task in tasks)
    stringBuilder.Append(task.Result);

为了让任务完成:
Task<string>[] tasks = new Task<string>()[max];
for (int i = 0; i < max; i++)
{
    tasks[i] = GetMyDataAsync(i).ContinueWith(t => stringBuilder.Append(t.Result));
}
Task.WaitAll(tasks);

如果您在async方法内部,也可以使用await Task.WhenAll(tasks)代替Task.WaitAll
注意事项:
  1. StringBuilder不是线程安全的:.NET的StringBuilder是否线程安全 ==> 您应该在ContinueWith中使用lock

  2. 如Matías所指出的:您还应检查任务是否成功完成


谢谢。正是我想要的。 - Hooch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接