2009-06-23 76 views
0

我有一個列表框,我必須給出最少2個文件進行合併。 合併完成時,我單擊合併按鈕。進度條開始和消息框出現文件已合併。我使用後臺工作人員運行進度欄。在ListBox中添加項目時,BackgroundWorker在C#中給出問題?

現在的問題是當合並完成與2個文件,我添加一個文件,單擊合併按鈕合併完成消息出現我單擊確定的消息框,再次消息框出現相同的消息合併已完成。此消息框將繼續顯示我在列表框中添加文件的次數。

例如,對於2個文件信息出現1CE巢穴上添加1級出現更多的文件的消息2ice,1個更多的文件中的列表框消息顯示3ic.Like存款保險計劃繼續....

當我用調試器來跟蹤它,我發現我的後臺工作Runcompleted事件被稱爲是一些每當我添加文件中的listbox.Here是合併按鈕Click事件的代碼次...

Worker.DoWork += new DoWorkEventHandler(Worker_DoWork); 
Worker.RunWorkerCompleted += 
    new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted); 
Worker.WorkerSupportsCancellation = true; 

if (!Worker.IsBusy) 
    Worker.RunWorkerAsync(); 
else 
    MessageBox.Show("Cannot run background worker twice "); 

if (Worker.IsBusy) 
{ 
    progress = new ProgressDialogDTB(); 
    progress.FormClosing += 
     new FormClosingEventHandler(ProgressDialog_FormClosing); 
    progress.ShowDialog(this); 
} 
while (Worker.IsBusy) 
{ 
    Application.DoEvents(); 
} 

//For Background Worker completed Event... 
private void Worker_RunWorkerCompleted(object sender, 
    AsyncCompletedEventArgs e) 
{    
    if (progress != null) 
    { 
     progress.Close(); 
     progress = null; 
    } 
    if (e.Cancelled) 
     MessageBox.Show(" Progress was cancelled ");        

    if (e.Error == null) 
     if (!e.Cancelled) 
      MessageBox.Show("Files has been merged "); 

    if (e.Error != null) 
     MessageBox.Show(e.Error.Message);  
}//Worker_RunWorkerCompleted 

我不知道在哪裏我錯了。 請幫助...謝謝...

+0

你可以分享工人代碼嗎?什麼構成完成?如果它被調用了x次,那麼它的理由是你的工作者已經完成了x次,或者因爲它是如何工作的或者它被實例化了x次。 – Lazarus 2009-06-23 11:46:46

+0

很多代碼,但沒有一個與問題有關。 – Will 2009-06-23 11:49:15

回答

3

我猜測每個合併按鈕點擊你註冊一個新的代表。如果下面的代碼:

Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork); 
Worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted); 

是在合併按鈕的單擊事件處理程序考慮將其移動到您的表單initailization方法。你只需要註冊一次委託。下一次你做它添加一個新的一個等等第二次合併點擊它將運行兩次,第三次點擊三次,依此類推。

2

如果您的工作人員是一個模塊級別的變量,並且您每次按下按鈕時都追加到其調用列表中,則每次都會調用該方法。 假設你點擊3次,那麼這個代碼Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);將被執行3次,並將被調用3次。 當您實例化工作對象時,設置一次Completed處理程序。

Bah!毆打它!