C# 并行调用方法并合并结果

C# 并行调用方法并合并结果,c#,parallel-processing,C#,Parallel Processing,我有一个main方法,它需要调用两个方法Method1和Method2并行。它们都将返回来自不同数据库的员工列表。我需要并行调用它们,然后在MainMethod中组合Method1和Method2的结果,然后将结果返回给MainMethod的调用者 如果人们能告诉我什么是方法的签名以及我需要编写什么代码,我将不胜感激。我的意思是异步/等待关键字。您可以将它们作为2任务运行。Result属性负责等待。大约: // untested Task<List<Employee>>

我有一个main方法,它需要调用两个方法Method1和Method2并行。它们都将返回来自不同数据库的员工列表。我需要并行调用它们,然后在MainMethod中组合Method1和Method2的结果,然后将结果返回给MainMethod的调用者


如果人们能告诉我什么是方法的签名以及我需要编写什么代码,我将不胜感激。我的意思是异步/等待关键字。

您可以将它们作为2
任务运行。Result属性负责等待。大约:

// untested 
Task<List<Employee>> t1 = Task.Factory.StartNew(() => Method1());
Task<List<Employee>> t2 = Task.Factory.StartNew(() => Method2());

var result = t1.Result.Concat(t2.Result);
//未经测试
taskt1=Task.Factory.StartNew(()=>Method1());
taskt2=Task.Factory.StartNew(()=>Method2());
var结果=t1.结果.浓度(t2.结果);

使用更多的速记

public static async Task<IEnumerable<Employee>> MainMethod()
{
    // Await when all to get an array of result sets after all of then have finished
    var results = await Task.WhenAll(
        Task.Run(() => Method1()), // Note that this leaves room for parameters to Method1...
        Task.Run(Method2)          // While this shorthands if there are no parameters
        // Any further method calls can go here as more Task.Run calls
        );

    // Simply select many over the result sets to get each result
    return results.SelectMany(r => r);
}
公共静态异步任务main方法()
{
//等待when all在完成所有操作后获取结果集数组
var results=wait Task.WhenAll(
Task.Run(()=>Method1()),//注意,这为Method1的参数留出了空间。。。
Task.Run(Method2)//而如果没有参数,则此方法会简化
//任何进一步的方法调用都可以作为更多Task.Run调用转到此处
);
//只需在结果集中选择多个即可获得每个结果
返回结果。选择many(r=>r);
}
对于签名引用,它使用以下.NET函数:

  • (作为扩展方法)

为什么“需要”它们并行?这里有一个重复项:@DStanley-Parallel.Invoke不是收集结果的方法。@DStanley也不能保证并行运行。代码根本不要求运行-确保如果使用
new Task
调用
Task.Start
来创建任务。另外,由于在执行get方法时锁定,长时间运行的部分可能不会并行运行,尽管它会得到正确的结果。这种锁定在技术上是正确的,因为它防止了对结果的多访问。然而,正如my和@HenkHolterman在我们的回答中所做的那样,最好是每个任务都运行,产生结果,然后将这些结果连接起来,而不是内联地添加到单一缓冲区中。更少的锁定,更少的获取(如果您的查询返回一个
IEnumerable
,它可能在迭代之前不会实际执行,这仍然可以完成锁定中的工作)。。。请告诉我Method1()或Method2()的签名必须是什么,以及如何从中返回结果以及需要使用的任何async/Wait关键字。它们只需要返回
列表
。不要在这里等待,亨克。。请看我的问题。我添加了一个我编写的示例代码。是吗?是的,看起来不错,但既不短也不高效。任务法出了什么问题?我不知道为什么我的问题被编辑了。它显然有我写的完整代码,以便其他人可以使用它。但是这是我的方法private static List Method1()和private static List Method2()的签名,你能告诉我Method1()和Method2()的签名是什么吗。你能写完整的代码吗?
Method1
Method2
都是简单的例子,取自这个问题的原始写作。不过我可以加一个签名