2012-12-02 24 views
0

我想在后台线程中执行一些操作。然而,我想在我的后台工作人员执行的方法的签名是不一样的。例如:通过C#中的并发队列执行通用方法

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

是否有可能使用ConcurrentQueue或以这样的方式的另一个类,允许我指定的对象,方法和参数的方法,我想委托我的工作线程?

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

回答

0

您可以使用匿名方法:

Queue<Action> Q; 

Q.Enqueue(()=> objA.method1(arg1)); 
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 

或者你可以使用明确写入方法...

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

+0

谢谢。但我需要一些与concurrentQueue解决方案接近的东西,因为我不想为每个新任务启动新线程 – user236215

相关问题