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;
    }
}

したがって、メソッドの本体がかなり小さい場合は、ここでラムダを介して任意のデリゲートを渡すことができます。

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

または、明示的に記述されたメソッドを使用できます...

確かに、必要がなければProgressChangedEventHandlerandを省略できます。RunWorkerCompletedEventHandler

于 2012-12-02T08:38:18.307 に答える