2013-04-28 45 views
0

後,我從文件中讀取數據,並將它們在其他文件中寫入。我想用標籤顯示讀線的用戶數量。它工作。用戶可以停止閱讀。我使用backgroundworke,但應用程序不響應停止按鈕 - 被凍結。我嘗試了Aplication.DoEvents(),但我必須只需要按兩次來響應。應用程序被凍結使用的BackgroundWorker C#

開始閱讀

private void button1_Click(object sender, EventArgs e) 
{ 
    string ext = Path.GetExtension(openFileDialog1.FileName); 
    if (ext == ".arff") 
    { 
     getColumn(); 
     backgroundWorker1.RunWorkerAsync(); 
    } 
} 

讀寫

private void readDataArffBig() 
{    
    int lines = 0; 
    StreamWriter sw = new StreamWriter(tempFile, true); 
    using (StreamReader sr = new StreamReader(openFileDialog1.FileName)) 
    { 
     while ((line = sr.ReadLine()) != null) 
     { 
      lines++; 
      backgroundWorker1.ReportProgress(lines); 
      if (status == false) 
       break; 
      sw.WriteLine(line)} 
     } 
} 

終止閱讀將狀態設置爲false..berofe是真的

private void stop_Click(object sender, EventArgs e) 
{ 
    status = false;   
} 

BW使用

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    readDataArffBig(); 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    label8.Text = e.ProgressPercentage.ToString(); 
    label8.Refresh(); 
} 
+3

你可以發佈你的點擊事件嗎?這很可能是問題所在。背景工作者可能沒有正確關閉。 – Nomad101 2013-04-28 23:13:06

+0

代碼被編輯 – 2013-04-28 23:20:48

+0

您正在閱讀的文件中有多少行?如果它是一個帶有10k行的文件,你可能會用太多的更新來氾濫UI線程。另外,你的'StreamWriter'應該在'using'語句中。 – 2013-04-28 23:37:40

回答

0

首先,你要爲你的BackgroundWorker允許取消?

backgroundWorker1.WorkerSupportsCancellation = true; 

然後你Do_Work事件應該是這個樣子:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWoker bgw = sender as BackgroundWorker; 
    if(bgw.CancellationPending) 
    { 
     e.Cancel = true; 
     return; 
    } 
    else 
    { 
     readDataArffBig(); 
    } 
} 

***編輯

private void stop_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.CancelAsync(); 
     //status = false;   
    } 
+0

我同意使用內置的取消機制會更好,但這隻會在開始操作之前檢查取消*。 OP需要修改'readDataArffBig'循環以檢查取消請求。 – 2013-04-28 23:46:37

+0

但用戶界面仍然無法響應..我無法點擊停止按鈕 – 2013-04-29 08:06:18

0

除了由SOfanatic提出的變化,由Mikež建議,你應該在readDataArffBig()中檢查掛起的取消。在聲明中,一個好的地方是正確的:

while (((line = sr.ReadLine()) != null) && (!backgroundWorker1.CancellationPending))