2012-04-03 61 views
-2

這可能嗎?將BackgroundWorker傳遞給由doWork調用的類?

我想要做的是讓我的doWork方法實例化另一個類,然後調用它的啓動方法。然後我想報告該類的進度回到父類中的ProgressChanged處理程序。我試過傳遞給BackgroundWorker的引用,但我得到一個錯誤。

private void ComplianceWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     ComplianceControlCenter CCC = 
     new ComplianceControlCenter(taskList.CheckedItems.OfType<string>().ToList(), 
            file_box.Text, &ComplianceWorker); 
     CCC.start(); 
    } 

編輯:

只有1個後臺工作。我想通過引用ComplianceControlCenter的構造函數來傳遞它,以便我可以從該類中向其發送進度更新。推理是這個班做一些相當複雜的工作,我需要有一個分工。如此反覆,我想通過從的doWork方法的CCC對象的後臺工作,所以我可以調用ComplianceWorker.ReportProgress();

錯誤1無法獲取地址,得到的大小,或指針聲明的管理鍵入('System.ComponentModel.BackgroundWorker')

+3

然後發佈錯誤的詳細信息。我想這與'&ComplianceWorker'中的'&'有關,但我想知道。 – 2012-04-03 07:14:50

回答

0

你可以這樣做,但我沒有看到它爲簡單情況提供了什麼目的。由於已經BackgroundWorker的業務方法中,因此通過創建另一個BackgroundWorker來使用更多線程並沒有意義,並且您可以在線執行相同的工作。

如果您仍然想要第二個BackgroundWorker,可以通過將處理程序附加到第二個工作人員的ProgressChanged事件中,將進度更改的事件從第二個工作人員傳播到第一個工作人員。然後,該處理程序會在第一個工作人員上提起ProgressChanged事件,傳播新聞。

例如:

private void ComplianceWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var CCC = new ComplianceControlCenter(/* ... */); 

    // Assume that CCC exposes a BackgroundWorker, but read below 
    var worker = CCC.Worker; // "second" worker 
    worker.ProgressChanged += this.PropagateProgressChanged; 

    CCC.start(); 
} 

private void PropagateProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    var worker = this.worker; // "first" worker 
    worker.ReportProgress(e.ProgressPercentage, e.UserState); 
} 

該代碼附加的事件處理程序的 「第二」 工人用

var worker = CCC.Worker; // "second" worker 
worker.ProgressChanged += this.PropagateProgressChanged; 

其中假定ComplianceControlCenter公開其自己的直接BackgroundWorker。由於情況可能並非如此,因此您可以通過將this.PropagateProgressChanged的引用傳遞給構造函數並讓它爲您附加事件處理函數來關聯該關係。

+0

我只想要1個後臺工作者。 – 2012-04-03 16:35:30

0

如果兩個後臺工作者都相同,則會運行到無限循環。可能會創建兩個不同的背景工作者。如果你需要在它們之間有類似的東西,創建一個基類/接口。

+0

我認爲OP只是想傳遞一個參考。 – 2012-04-03 07:16:00

0

爲什麼不只是將BackgroundWorker的參考作爲參數傳遞給「工作」方法?

編輯:

事實上,你所要做的,如果你想報告進展情況或檢查CancellationPending標誌,如果你也能想手動取消您的操作。

+0

是的,那正是我想要做的。 – 2012-04-03 16:36:03

+1

BackgroundWorker worker =發件人爲BackgroundWorker; – Pedro77 2017-01-12 15:15:44

1

在C#中,引用傳遞這樣的:

ComplianceControlCenter CCC = new ComplianceControlCenter(..., ComplianceWorker); 

不喜歡這個

ComplianceControlCenter CCC = new ComplianceControlCenter(..., &ComplianceWorker); 

作爲一個側面說明,這是習慣,讓變量和字段以小寫字母,所以我會將ComplianceWorker重命名爲complianceWorker。請注意,這也提高了語法高亮的StackOverflow:;-)

ComplianceControlCenter ccc = new ComplianceControlCenter(..., complianceWorker); 
0

如果您需要BackgroundWorker本身DoWork事件中只是上溯造型的sender。也許是這樣的:

private void ComplianceWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var worker = sender as BackgroundWorker; 
    if(worker == null) 
    { 
     //ToDo: What should happen if MS changes the behavior?? 
    } 

    ComplianceControlCenter CCC = new ComplianceControlCenter(taskList.CheckedItems.OfType<string>().ToList(), file_box.Text, worker); 
    CCC.start(); 
} 
+0

替代建議:'var worker =(BackgroundWorker)sender;'。如果「MS改變行爲」,這將確保程序失敗並帶有InvalidCastException。 – Heinzi 2012-04-03 07:30:47

+0

@Heinzi:是的,你說得對,但我只是想在代碼示例中指出這個問題。 – Oliver 2012-04-03 07:49:54

0

通過這樣解決了吧..

ComplianceControlCenter CCC = new ComplianceControlCenter(taskList.CheckedItems.OfType<string>().ToList(), file_box.Text,ref complianceWorker); 

以此爲構造函數。

public ComplianceControlCenter(List<string> task_list, String exe_location, ref BackgroundWorker complianceWorker)