2010-09-22 88 views
1

我看過其他人有類似的問題,但不是我正在尋找的。在backgrounderworker類的dowork事件中,我創建了一個新類的實例並調用它的一個函數。以前,我在windows.form.timer tick事件中使用了這段代碼,並且將一個委託作爲參數之一傳入,以允許在類中調用的函數和其他函數調用窗體上的方法來更新數據網格在GUI上。在道路事件中有沒有辦法做到這一點?我需要這個,因爲我從dowork調用的函數會調用其他函數,我希望每個函數都可以在GUI數據網格中記錄信息。是否有可能從後臺工作人員dowork事件更新UI

回答

0

除了在Hans的回答中提到的ReportProgess之外,您還可以在UI元素之一上使用Control.Invoke來在UI線程中執行代碼。

+0

但是在DoWork中,我可以將此能力(作爲委託參數)傳遞給DoWork中的一個類instanstiate嗎? – daustin 2010-09-23 12:36:26

+0

@ user94593:好的。 – Heinzi 2010-09-23 13:20:12

+0

你碰巧有代碼示例嗎? – daustin 2010-09-27 20:54:44

5

BackgroundWorker.ReportProgress()方法打算做到這一點。您實現ProgressChanged事件來更新UI,它將在主線程上運行。您不僅僅限於報告進度百分比,還可以傳遞任何對象以通過使用接受userState參數的超載將信息傳遞給事件處理程序。請注意,如果你這樣做,你必須使用適當的鎖定。

+0

不要忘記在後臺工作者本身上將'WorkerReportsProgress'屬性設置爲'true'。 – 2010-09-22 20:38:59

+0

這是我使用ReportProgress時遇到的問題。在DoWork中,我打電話給一個功能。該函數調用其他函數。我希望所有這些功能都能夠向UI發送狀態更新。 – daustin 2010-09-23 12:29:56

+0

因此,編寫一個調用ReportProgress的函數,以便所有這些其他函數都可以調用它。如果必須通過代表。小心,線編組非常昂貴。每秒調用超過1000次,UI線程無法跟上時就死掉了。 – 2010-09-23 12:55:04

0

您可以將進度數據發送回UI線程,您將在UI線程上獲得該事件,然後您可以更新屏幕。它是非常喜歡您發送回UI線程的對象是不可變的。除了撥打ReportProgress並處理活動外,您還需要將WorkerSupportsProgress屬性設置爲true來選擇加入。