c# - .NET 2.0 中的等效任务

标签 c# multithreading task .net-2.0

<分区>

我知道 .NET 2.0 现在可能真的很老了。
但是我有我想在 .NET 2.0 下编译的代码。不幸的是,源代码使用 .NET 4.0 System.Threading.Tasks

这里是代码:

int count = GetCount();

Task[] tasks = new Task[count];

for (int p = 0; p < count; p++)
{
     int current = p;
     tasks[p] = Task.Run(() =>
     {
         // Do something here
     });
}
Task.WaitAll(tasks);

我不是线程专家 有人可以在 .NET 2.0 中重现相同的行为并提供清晰的解释吗?

最佳答案

我的解决方案是使用 BackgroundWorker 并将其包装在辅助类中。
这样您还可以指定其他完成事件。

public delegate void Action();

public class TaskRunner
{
    private readonly object _lock = new object();
    private bool _complete;
    private int _counter;

    public void AddTask(Action action)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += (sender, args) => action();
        worker.RunWorkerCompleted += (sender, args) =>
        {
            try
            {
                Monitor.Enter(_lock);
                if (--_counter == 0)
                {
                    Monitor.Pulse(_lock);
                }
            }
            finally
            {
                Monitor.Exit(_lock);
            }
        };

        try
        {
            Monitor.Enter(_lock);
            if (_complete)
            {
                throw new Exception("task runner is complete");
            }

            _counter++;
            worker.RunWorkerAsync();
        }
        finally
        {
            Monitor.Exit(_lock);
        }
    }

    public void Wait()
    {
        while (!_complete)
        {
            try
            {
                Monitor.Enter(_lock);

                if (_counter == 0)
                {
                    _complete = true;
                    return;
                }

                Monitor.Wait(_lock);
            }
            finally
            {
                Monitor.Exit(_lock);
            }
        }
    }
}

static void Main(string[] args)
{
    var task = new TaskRunner();

    for (var i = 0; i < 10; i++)
    {
        task.AddTask(() => 
        { 
            //Do something
        });
    }

    task.Wait();

    Console.WriteLine("Done");
    Console.ReadLine();
}

希望对您有所帮助。

关于c# - .NET 2.0 中的等效任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34087518/

相关文章:

c# - 读取 app.config 的 connectionStrings 元素

c++ - 使用传递函数指针调用 _beginthreadx

c# - 任务和 TAP 异步模式 : differences bwteewn factory. StartNew 和 TaskEx.Run

javascript - 微任务是否保证在它们排队的同一动画帧内触发?

c# - 将从接口(interface)类型获得的 MethodInfo 对象转换为 C# 中实现类型的相应 MethodInfo 对象?

c# - 与字符串统一设置下拉值

c# - 如何正确序列化自动生成的 WCF 类型

c# - 在双核上使用 Parallel.For... 实现 5 倍性能?

android - 为什么我在尝试从非 ui 线程更改 UI View 组件时没有得到预期的 CalledFromWrongThreadException

c# - 返回任务而不是等待内部方法调用