0

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

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

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

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

4

2 回答 2

0

您可以使用匿名方法:

 Queue<Action> Q;

 Q.Enqueue(()=> objA.method1(arg1));
于 2012-12-02T08:30:29.987 回答
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如果您不需要它们,您可以省略其中的任何一个。

于 2012-12-02T08:38:18.307 回答