2011-09-02 61 views
0

Windows mobile 5;緊湊的框架和相對新手到C#和線程。如何在win中結束線程CF

我想從我自己的網站下載大文件(幾兆)作爲GPRS,這可能需要一段時間。我想顯示一個進度條,並允許一個選項取消下載。

我有一個名爲FileDownload的類並創建它的一個實例;給它一個URL和保存位置然後:

MyFileDownLoader.Changed += new FileDownLoader.ChangedEventHandler(InvokeProgressBar); 

BGDownload = new Thread(new ThreadStart(MyFileDownLoader.DownloadFile)); 
BGDownload.Start(); 

因此,我創建一個事件處理程序更新進度條,並啓動線程。這工作正常。

我有一個取消按鈕曰:

MyFileDownLoader.Changed -= InvokeProgressBar; 
MyFileDownLoader.Cancel(); 
BGDownload.Join(); 
lblPercentage.Text = CurPercentage + " Cancelled"; // CurPercentage is a string 
lblPercentage.Refresh(); 
btnUpdate.Enabled = true; 

FileDownload類中的主要部分是:

public void Cancel() 
{ 
    CancelRequest = true; 
} 

在方法下載文件:

... 
success = false; 
try { 
//loop until no data is returned 
while ((bytesRead = responseStream.Read(buffer, 0, maxRead)) > 0) 
{ 
    _totalBytesRead += bytesRead; 
    BytesChanged(_totalBytesRead); 
    fileStream.Write(buffer, 0, bytesRead); 
    if (CancelRequest) 
     break; 
} 

if (!CancelRequest) 
    success = true; 
} 
catch 
{ 
    success = false; 
    // other error handling code 
} 
finally 
{ 
    if (null != responseStream) 
     responseStream.Close(); 
    if (null != response) 
     response.Close(); 
    if (null != fileStream) 
     fileStream.Close(); 
} 

// if part of the file was written and the transfer failed, delete the partial file 
if (!success && File.Exists(destination)) 
    File.Delete(destination); 

的我正在使用的代碼是基於http://spitzkoff.com/craig/?p=24

我得到的問題是當我取消時,下載立即停止,但完成加入過程可能需要5秒左右的時間。這通過在加入後更新lblPercentage.Text來證明。

如果我然後嘗試再次下載,它有時會起作用,有時候我會得到一個nullreference異常(仍然試圖跟蹤它)。

我想我在取消線程的方法中做錯了什麼。

我是嗎?

回答

1
public void Cancel() 
    { 
     CancelRequest = true; 
    } 

我想你應該添加線程安全的這個動作。

public void Cancel() 
     { 
      lock (this) 
      { 
       CancelRequest = true; 
      } 
     } 

希望得到這個幫助!

+0

謝謝;那幫助了一個小孩;進一步調試發現,關閉流可能需要很長時間;這就是造成延誤的原因 – andrew