簡體   English   中英

c# backgroundWorker 未引發 ProgressChanged 或 RunWorkerCompleted 事件

[英]c# backgroundWorker not raising ProgressChanged or RunWorkerCompleted events

使用 C# .NET 3.5。

似乎我不是唯一一個,因為搜索似乎提出了很多類似的問題,但是通過它們閱讀我似乎仍然缺少解決方案。

我正在通過單擊我的 UI 上的按鈕引發一個事件,然后應該啟動一個 backgroundWorker 以完成一些耗時的工作 - 在這種情況下,我希望它從表單中收集信息並 a) 寫入 xml文件以及 b) 將信息插入遠程數據庫。

我相信這正是 backgroundWorker 的設計和意圖。

這是事件引發代碼。

private void btnFinish_Click(object sender, EventArgs e)
{
    clkFinish.setInstant();
    curAct.setTimeFinish(DateTime.Now);
    btnStart.Enabled = true;
    bgwDataWorker.RunWorkerAsync();
    for (int i = 0; i < 20; i++)
    {
        Console.WriteLine("Thread a: " + i);
        Thread.Sleep(100);
        if (i == (20 - 1))
        {
            Console.WriteLine("Finished");
        }
    }

}

如您所見,我在那里有一些代碼用作后台工作人員代碼的平衡,這里是:

private void bgwDataWorker_DoWork(object sender, DoWorkEventArgs e)
{
    Console.WriteLine("Running in a different thread now");
    int count = 0;
    for (int i = 0; i < 21; i++)
    {
        Console.WriteLine("Thread b: " + i);
        Thread.Sleep(100);
        (sender as BackgroundWorker).ReportProgress(5 * i, null);
        if (i == (21 - 1))
        {
            count = i;
        }
    }
    e.Result = count;
}

到目前為止,一切似乎都在進行中。

我的問題是,當 DoWork 方法中的代碼完成后,什么也沒有發生。 下面是 ProgressChanged 和 RunWorkerComplete 方法。

private void bgwDataWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    Console.WriteLine(e.ProgressPercentage);
}

private void bgwDataWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Console.WriteLine("Result is " + e.Result.ToString());

}

這讓我很困惑。

我嘗試運行MSDN 中的示例,但遇到了同樣的問題。 RunWorkerCompleted 和 ReportProgress 事件由於某種原因根本沒有被引發,我不明白為什么。

謝謝閱讀。

艾倫

你沒有錯過設置這些變量,是嗎?

backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;

它也可能是 DoWork 方法中的一個例外,沒有得到處理。

我有同樣的問題,我只是想出了答案。

在 backgroundworker 的屬性中,確保 ProgressChanged 和 RunWorkerCompleted 列出了它們的函數名稱(我的分別稱為“backgroundWorker1_ProgressChanged”和“backgroundWorker1_RunWorkerCompleted”)。

Inksmithy,您提到您已重命名 BackgroundWorker。 請注意,當您執行此操作時,Forms 設計器不會自動更改對舊 DoWork 和 RunWorkerCompleted 方法的引用。 因此,在您的 Forms 設計器中,單擊 BackgroundWorker,然后單擊屬性 Window 中的事件圖標(閃電),並仔細檢查它是否指向正確的事件方法名稱。

WorkerReportsProgress屬性設置為 True。

我有一個項目 [A],(前一段時間建立)進度條正常工作。 當前應用 [B] 未報告進度。 出於某種原因,應用程序 [A] 連接了進度和工作完成事件處理程序。 所以,我在應用程序 [B] 中連接了事件處理程序,它正在工作。 處理程序被復制到 Designer.cs 部分 class 文件中。 (假設他們可以在 form.cs 部分類中使用 go)。

// 
        // backgroundWorker1
        // 
        this.backgroundWorker1.WorkerReportsProgress = true;
        this.backgroundWorker1.WorkerSupportsCancellation = true;
        this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
        this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
        this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
//

希望這可以幫助。 不知道為什么應用程序 [A] 是通過使用工具箱將后台工作人員放置在表單設計 window 上來連接的。 使用 VS2012 和 Windows 7.

另外,我正在計算進度百分比,由於某種原因,列表框中的項目數乘以選定復選框的數量超過 100% - 它拋出並出錯。 因此,我將百分比限制在 99,並將這部分作為我的邏輯,以便將進度百分比報告回事件。

我最近有這個問題。 這是因為我讓主線程休眠直到后台線程完成,這阻止了更新的執行。

我通過將我的 object(包含工作線程)包裝到另一個線程中解決了這個問題,以便可以執行進度更新,更改主線程中的值允許我的睡眠線程繼續。

你遺漏了一個重要的部分 - 一個 boolean 標志,允許它引發事件

bgwDataWorker.WorkerReportsProgress = true;
bgwDataWorker.WorkerSupportsCancellation = true;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM