c# - 如何并行运行一组函数并等待完成后的结果?

标签 c# .net multithreading parallel-processing

我需要同时异步运行一组繁重的函数并将结果填充到列表中。这是伪代码:

List<TResult> results = new List<TResults>();
List<Func<T, TResult>> tasks = PopulateTasks();

foreach(var task in tasks)
{
    // Run Logic in question
    1. Run each task asynchronously/parallely
    2. Put the results in the results list upon each task completion
}

Console.WriteLine("All tasks completed and results populated");

我需要 foreach block 中的逻辑。你们能帮帮我吗?

我有一些限制:解决方案必须符合 .net 3.5(不是 .net 4,但出于我的知识目的,将不胜感激 .net 4 替代解决方案)

提前致谢。

最佳答案

一个简单的 3.5 实现看起来像这样

List<TResult> results = new List<TResults>();
List<Func<T, TResult>> tasks = PopulateTasks();

ManualResetEvent waitHandle = new ManualResetEvent(false);
void RunTasks()
{
    int i = 0;
    foreach(var task in tasks)
    {
        int captured = i++;
        ThreadPool.QueueUserWorkItem(state => RunTask(task, captured))
    }

    waitHandle.WaitOne();

    Console.WriteLine("All tasks completed and results populated");
}

private int counter;
private readonly object listLock = new object();
void RunTask(Func<T, TResult> task, int index)
{
    var res = task(...); //You haven't specified where the parameter comes from
    lock (listLock )
    {
       results[index] = res;
    }
    if (InterLocked.Increment(ref counter) == tasks.Count)
        waitHandle.Set();
}

关于c# - 如何并行运行一组函数并等待完成后的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4068971/

相关文章:

c# - 谷歌分析(api),计算应用程序数据选择

c# - azure 存储队列中的最大出队计数

C# 将 UTC int 转换为 DateTime 对象

c# - 首先使用 EF4 代码制作存储库类的最佳做法是什么?

c# - 如何对包含 EntityFunctions.AddDays 函数的 GetNewValues() 进行单元测试

c# - 如何在 .NET 中查找 windows 拨号规则

C# 使用 sql LIKE 过滤 datagridview 日期时间字段

swift - 在 swift 中通过 NSURLSession 重用线程

c# - 如何按照多线程 Web 应用程序中的查询结果显示顺序?

c++ - GDB 在从特定函数调用时抛出异常时中断