在C#中通过并发队列执行泛型方法

时间:2012-12-02 08:23:39

标签: c# multithreading

我想在后台线程中执行一些操作。但是,我想在后台工作程序中执行的方法的签名是不一样的。例如:

objA.method1(arg1)
objA.method2(arg2)
objB.method3(arg3)
objA.method4(arg4)

是否可以以允许我指定方法的对象,方法和参数的方式使用ConcurrentQueue或其他类,我想将其委托给我的工作线程?

我想使用类似于ConcurrentQueue的东西,这将允许我使用生产者 - 消费者模式来生成和消费工作。

2 个答案:

答案 0 :(得分:0)

您可以使用匿名方法:

 Queue<Action> Q;

 Q.Enqueue(()=> objA.method1(arg1));

答案 1 :(得分:0)

实际上BackgroundWorker有很多替代品,但你确实可以用它做任何事情。一旦我通过这样的static方法做到了这一点:

static BackgroundWorker StartWorker(DoWorkEventHandler _doWork,
                                    ProgressChangedEventHandler _progressChanged,
                                    RunWorkerCompletedEventHandler _runWorkerCompleted,
                                    bool _workerReportsProgress,
                                    bool _workerSupportsCancellation,
                                    object arg)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerReportsProgress = _workerReportsProgress;
    worker.WorkerSupportsCancellation = _workerSupportsCancellation;
    worker.DoWork += _doWork;
    worker.ProgressChanged += _progressChanged;
    worker.RunWorkerCompleted += _runWorkerCompleted;
    try
    {
        worker.RunWorkerAsync(arg);
        return worker;
    }
    catch (Exception ex)
    {
        //...
        return null;
    }
}

所以你可以通过lambda传递任何代表,如果方法的主体相当小:

StartWorker((s, e) =>
    {
        object argument = e.Argument;
        //do any work you need
    },
    (s, e) =>
    {
        //do smth on progress changed
    },
    (s, e) =>
    {
        //do smth on worker completed
    },
    true,
    true,
    null);//pass any argument you need

或者您可以使用明确编写的方法......

如果您不需要,可以省略ProgressChangedEventHandlerRunWorkerCompletedEventHandler中的任何一个。