none
請問有無使用BackgroundWorker 造成死當的解法 RRS feed

  • 問題

  • 大家好

    程式中Button.click事件中起了兩個BackgroundWorker ,在Debug Mode執行都無問題

    但是執行 bin\Debug 裡面的程式卻死當,Form 畫面都無法更新

    因此想請問有無此經驗可以協助解決

    2008年9月10日 上午 09:32

所有回覆

  • 不知道您有沒有寫錯?

     

    tihs

    2008年9月11日 上午 05:39
  • 感謝您的回應

    可能是我語意表達不清

    在 C# Editor 中執行程式,程式可以完整無誤的執行

    但執行 bin\Debug 的執行檔,感覺好像Form 被Hold住了,所設定的Timer也無法refresh畫面

     

    因為在編輯模式中可以正確執行,所以認為不是程式問題所造成,不知道有無類似情況可以協助處理

     

     

    private void Form1_Load(object sender, EventArgs e)
            {
                XSearch.RootForSearch = @"D:\EDC_DATA";
                XSearch.MessageLabel = tssShowSearchFile;
                XSearch.FileList = dsEDCDataSet.Tables["QueueList"];
                XSearch.SearchComplete += SearchCompleted;
                dgvQueueList.DataSource = dsEDCDataSet.Tables["QueueList"];
                ImportDBConn = new OleDbConnection(EDCLoaderDefClass.ParaDef.EDCDBConnect);
                ImportDB.AssConnection = ImportDBConn;
                ImportDB.QueueList = dsEDCDataSet.Tables["QueueList"];
                ImportDB.DesPath = @"D:\EDC_DATA_BAK";
                ImportDB.RootPath = @"D:\EDC_DATA";
                ImportDB.ThreadNum = 1;
                OracleDB.OleDbConnection = ImportDBConn;
                OracleDB.OpenSql("Select * from EDC_PARA");
               

            }       
            private void SearchCompleted(object sender, EventArgs e)
            {
                ImportDB.SearchComplete = true;
            }

            private void SearchFileInPath(String FilePath)
            {
               

            }

            private void button1_Click(object sender, EventArgs e)
            {
                XSearch.Start();       --程式是由此開始執行 XSearch 會開啟一個BackgroudWorker 去尋找一個目錄中所有的XML File
                while (!(XSearch.Status == EDCLoaderDefClass.ProgramStatus.StartInsert) || XSearch.isSearchComplete)
                   
                {
                    Application.DoEvents();                                 
                }
                if (!XSearch.isSearchComplete)
                    ImportDB.Start();  --此程式會開啟 ImportDB.ThreadNum 所定的ThreadNum,會分析XML 檔案內容做處理

            }

            private void button2_Click(object sender, EventArgs e)
            {
                XSearch.Pause = !XSearch.Pause;
            }


            private void tmTimeMonitor_Tick(object sender, EventArgs e)
            {
                //Application.DoEvents(); 
                dgvQueueList.Refresh(); -- Timer 每0.5秒執行一次
                this.Refresh();
            }

    2008年9月12日 上午 02:42
  •  

     

    在 BackgroundWorkerk 裡面的 RunWorkerCompleted 事件可以好好運用~

     

    將 ImportDB.Start(); 加到 RunWorkerCompleted 事件 裡面。

     

    在button1_Click 裡面只要 觸發 BackgroundWorkerk 的RunWorkerAsync 就好了~

     

    button1_Click 裡面的其它程式可以都刪了~
    2008年9月12日 上午 03:20
  • HI,

     

    button1_Click中應該不用執行:

    while (!(XSearch.Status == EDCLoaderDefClass.ProgramStatus.StartInsert) || XSearch.isSearchComplete)
                   
                {
                    Application.DoEvents();                                 
                }
                if (!XSearch.isSearchComplete)
                    ImportDB.Start();  --此程式會開啟 ImportDB.ThreadNum 所定的ThreadNum,會分析XML 檔案內容做處理

     

    應該是這些程式的影響. 改在SearchCompleted中加入下列的程式碼:

    private void SearchCompleted(object sender, EventArgs e)
            {
                ImportDB.SearchComplete = true;

                ImportDB.Start();  
            }

     

    tihs

    2008年9月13日 上午 08:05