2011-07-13 44 views
6

我創建的backgroundworker不是在我的Windows窗體中,而是在實現所有處理的類文件(BusinessLogic)中。從主窗體我首先調用初始化BGW的BL方法。然後我打電話給啓動BGW的BL的方法。BackgroundWorker不會觸發RunWorkerCompleted事件

這裏是更多的背景:)在我的實施。 How to use BackGroundWorker in class file?

DoWork事件運行良好,但它沒有調用RunWorkerCompleted。

一些谷歌搜索,我找到了這個鏈接。我有一種感覺,我的問題和這個傢伙一樣。 http://www.eggheadcafe.com/software/aspnet/29191764/backgroundworker-does-not-fire-the-runworkercompleted-event.aspx

我很感謝在這個問題上的任何意見。提前致謝。

守則主要形式有:

private void frmMain_Load(object sender, EventArgs e) 
    { 
     Hide(); 
     BusinessLogic.BGWInitialize(); 
     BusinessLogic.StartBackgroundWorker();     
     while (!BusinessLogic.firstCycleDone) 
     { 
     Thread.Sleep(100); 
     } 
     Show();    
    }   

代碼在BusinessLogic:

public static void BGWInitialize() 
    { 
     bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
     bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged); 
     bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); 
     bgWorker.WorkerReportsProgress = true; 
    } 

    public static void StartBackgroundWorker() 
    { 
     bgWorker.RunWorkerAsync(); 
    } 


    private static void bgWorker_RunWorkerCompleted(
     object sender, RunWorkerCompletedEventArgs e) 
    {    
     firstCycleDone = true;    

    } 
+1

(略題外話)我必須承擔,這是不是你要在投入現場的代碼,但以防萬一這是爲什麼你是否正在調用一個新的BG線程來完成這項工作,然後在調用線程上調用Thread.Sleep()?爲什麼不只是同步工作? – ZombieSheep

+0

嗯,是的,我剛剛發現。 :)我在我的應用程序中通過多個表單執行此操作(稱爲BGW),並默認在主窗體中實現它。然而,主表格不需要BGW,因爲我希望應用程序只在處理完成後才能打開。 – Arcturus

回答

6

完成的事件被調用,以主線程。它應該被拾取並由MessagePump執行。

但是,您的等待和休眠代碼阻止了消息循環。

Hide(); 
    .... 
    while (!BusinessLogic.firstCycleDone) 
    { 
    Thread.Sleep(100); 
    } 
    Show(); 

這裏的答案是,你有沒有用一個BackgroundWorker或線程的另一種形式......

只需直接調用bgWorker_DoWork()

// Hide(); 
bgWorker_DoWork(); // rename 
Show(); 
+0

或者,如果您確實想因某種原因阻止主線程,請在您的工作例程退出之前設置該標誌。 –

+0

謝謝你解決了這個問題。是的,這是非常愚蠢的我使用線程,然後暫停主線程,直到工作線程完成處理。在我的防守中,我在應用程序中以多種形式使用BGW,這是我需要等待處理完成的唯一實例。所以我只是複製粘貼我的其他代碼在這裏,並不認爲這將不需要在這種情況下。 – Arcturus

+0

@HenkHolterman我的主線程正在等待一個信號量,RunWorkerCompleted應該釋放,這導致了一個死鎖。我如何等待主線程,同時確保可以調用RunWorkerCompleted? – Omtara

-1

,如果你只想打電話Application.DoEvents();代替Sleep(100);你的代碼會工作,但正如我前面所說BackgroundWorker類是一個錯誤的東西,我會親自使用我自己的線程和報告

或者,您也可以睡了一下,然後調用DoEvents

+7

背景工作者不是越野車。但是大多數使用Application.DoEvents()的程序都是。 –

+1

我還沒有說過這是一個完美的解決方案,在我的經驗'BackgroundWorker'是越野車。我可以有我自己的意見嗎? – Djole

+11

只有您備份(示例/鏈接) –