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異常(仍然試圖跟蹤它)。
我想我在取消線程的方法中做錯了什麼。
我是嗎?
謝謝;那幫助了一個小孩;進一步調試發現,關閉流可能需要很長時間;這就是造成延誤的原因 – andrew