【问题标题】:How to return another value from method in "third party" lib?如何从“第三方”库中的方法返回另一个值?
【发布时间】:2012-05-20 11:09:14
【问题描述】:
Task<string>[] tableOfWebClientTasks = new Task<string>[taskCount];

for (int i = 0; i < taskCount; i++)
{
    tableOfWebClientTasks[i] = new WebClient().DownloadStringTask(allUrls[count - i - 1]);
}

Task.Factory.ContinueWhenAll(tableOfWebClientTasks, tasks =>
{
    Parallel.ForEach(tasks, task =>
    {
        //Here I have result from each task.
        //But information which url is executed on this task, is lost.
    });
});

例如,我可以创建类(具有两个公共属性,一个用于任务,第二个用于 url)并返回实例。但是这个方法我连接了其他方法。

你有解决这个问题的办法吗?

【问题讨论】:

  • 你为什么使用ContinueWhenAll()Paralell.ForEach()?每个Task 上的ContinueWith() 不是更好吗?
  • 那篇文章没有解释为什么你会这样做。为什么每个Task 上的ContinueWith() 不适合您?

标签: c# task-parallel-library parallel-extensions


【解决方案1】:

如果您希望能够将您的任务与创建它们的 url 相关联,您可以使用字典进行映射:

Task<string>[] tableOfWebClientTasks = new Task<string>[taskCount];
var taskIdToUrl = new Dictionary<int,string>();

for (int i = 0; i < taskCount; i++)
{
    var url = allUrls[count - i - 1];
    var task = new WebClient().DownloadStringTask(url);
    tableOfWebClientTasks[i] = task;
    taskIdToUrl.Add(task.Id, url);
}

TaskFactory.ContinueWhenAll(tableOfWebClientTasks, tasks =>
{
    Parallel.ForEach(tasks, task =>
    {
        // To get the url just do:
        var url = taskIdToUrl[task.Id];
    });
});

【讨论】:

  • 我认为以思考的方式去做通常不是一个好主意(尽管它可能在这种特定情况下有效)。例如,某些异步方法可能会为多个不同的输入返回相同的 Task,这会破坏您的代码。
  • 是的。除非有具体的理由这样做,否则我同意在每个 Task 上调用 ContinueWith()
  • @RichardTowers 谢谢,确实是我想要的。
猜你喜欢
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多