2012-12-02 22 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

相關問題