C#中的并行处理/并行编程

我需要处理多个函数,并执行返回相同类型记录的结果。 考虑到我的function,我在visual studio 2010下使用c#:

class Search{ public list GetrecordsofAAA(string term); public list GetrecordsofBBB(string term); public list GetrecordsofCCC(string term); } 

我用这种方式调用函数

 list records1 = Search.GetrecordsofAAA(heart); list records2 = Search.GetrecordsofBBB(heart); list records3 = Search.GetrecordsofCCC(heart); 

这是系列处理。

如果可能的话,我需要同时填写记录1,记录2和记录3。

 //make a list of the search functions you want to call. var Searches = new List>> { a => GetrecordsofAAA(a), a => GetrecordsofBBB(a), a => GetrecordsofCCC(a), } //Execute them in parallel and collect the results as lists of lists of wrecord IEnumerable> result = Searches.AsParallel().Select(a => a(heart)); 

看一下.NET Framework 4中引入的任务并行库(TPL) (即使用Visual Studio 2010)。 更具体地说,就TPL而言,您的问题可以通过任务并行来解决。

现在,我自己不是TPL专家,但文档表明你应该能够用Parallel.Invoke做你想做的事:

 using System.Threading.Tasks; … List records1 = null; List records2 = null; List records3 = null; // ^ Initialize these to any default value to prevent a compile-time error. // The compiler cannot know that below delegates will actually be called, // so without the initialization you would soon get a "use of unassigned // variable" error. Parallel.Invoke( () => { records1 = Search.GetrecordsofAAA(heart); }, () => { records2 = Search.GetrecordsofBBB(heart); }, () => { records3 = Search.GetrecordsofCCC(heart); } ); 

PS:一旦你的方法并行执行,你需要确保它们都没有任何可能导致其他方法无法正常工作的副作用。 (例如,如果这些方法读取和修改属于您的Search类的相同静态字段,则可能会导致问题。)

使用任务并行库,您可以执行以下操作:

 list records1; lList records2; lList records3; Task task1 = Task.Factory.StartNew(() => records1 = Search.GetrecordsofAAA(heart)); Task task2 = Task.Factory.StartNew(() => records2 = Search.GetrecordsofBBB(heart)); Task task3 = Task.Factory.StartNew(() => records3 = Search.GetrecordsofCCC(heart)); Task.WaitAll(task1, task2, task3); // Wait for all three tasks to finish // Do stuff after 

Parallel.Invoke并不认为操作将是异步的。 如果你需要garuntee,而不是使用上面的任务。

这是一个可能解决方案的草图:为要运行的每个方法创建任务,启动每个任务,然后WaitAll()等待每个任务完成。

  // Create an array of methods to run Func>[] methods = new[] { s => GetRecordsOfAAA((string) s), s => GetRecordsOfBBB((string) s), s => GetRecordsOfCCC((string) s) }; // Create an array of tasks Task>[] tasks = new Task>[methods.Length]; // Create and start each task for (int i = 0; i < tasks.Length; i++) { tasks[i] = Task>.Factory.StartNew(methods[i], heart); } // Wait for all tasks to complete. Results are in tasks[n].Result Task.WaitAll(tasks);