【问题标题】:C# .Net Wait for all threads to complete and get return valuesC# .Net 等待所有线程完成并获取返回值
【发布时间】:2017-04-15 04:31:30
【问题描述】:

我正在使用以下代码创建两个线程并等待它们完成:

Task task1 = Task.Factory.StartNew(() => DoSomething(a, b));
Task task2 = Task.Factory.StartNew(() => DoSomething(a, b));

Task.WaitAll(task1, task2);

DoSomething 方法返回的返回类型为字符串,当两个任务完成时,我想使用它的返回值。

我尝试创建两个字符串变量,并为它们分配返回值,如下所示:

string x, y;
Task task1 = Task.Factory.StartNew(() => x = DoSomething(a, b));
Task task2 = Task.Factory.StartNew(() => y = DoSomething(a, b));

但是我得到一个 x 和 y 未分配的编译时错误,我在这里缺少什么?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    尝试使用Task<string> 而不是Task 并查询Task<string>.Result

    【讨论】:

      【解决方案2】:

      他说这是编译时错误;我假设它归咎于默认值。 在第一行中,将 x 和 y 的默认值分配给 null

      string x = null;
      string y = null;
      Task task1 = Task.Factory.StartNew(() => x = DoSomething(a, b));
      Task task2 = Task.Factory.StartNew(() => y = DoSomething(a, b));
      

      在这之后

      Task.WhenAll(task1, task2).ContinueWith((tasks)=>{ // access results here});
      

      【讨论】:

      • 为什么反对票;最初 ? :( 我确定这是问题所在。
      【解决方案3】:

      使用Task.Run很容易实现

      var task1 = Task.Run(() => DoSomething(a, b));
      var task2 = Task.Run(() => DoSomething(a, b));
      var result1 = await task1;
      var result2 = await task2;
      

      【讨论】:

        猜你喜欢
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多