我的目的是要下載網頁後,匯出內容做進一步處理
我使用 WebClient.DownloadFile() 下載
下載失敗等待幾秒後重新下載
但如果是下載卡住,我就不知道怎麼處理了
有一定機率會發生這種狀況

http://pastebin.com/CLQ1U8aF

下載資料一定會有錯誤發生

你的問題在於萬一該url是錯誤的,或者連線問題

你的程式就進入到catch區塊
但是你的catch區塊就是一直反覆重試

萬一url是錯的,它就一直重試,所以應該設定一個條件,錯誤次數達到設定條件,例如10次,就放棄不要重試,程式就不會卡住了
Wesley Hsu wrote:
下載資料一定會有錯誤...(恕刪)

這個問題我會處理
http://pastebin.com/QkmArSp0

我的不會的是
當資料下載到一半時停住或是變超慢
我要怎麼讓它放棄這次下載


要使用非同步作業,這樣WebClient就可以呼叫CancelAsync來停止作業

如果不使用非同步作業,執行緒會住
Wesley Hsu wrote:
要使用非同步作業,這...(恕刪)

這東西好難寫,目前只能做到這樣
http://pastebin.com/UyjG4c1p

還有好多問題沒解決
下載完成前禁用 buttonStart
下載完成後啟用 buttonStart
用按鈕取消下載
下載超時自動取消
...

看著寫完的 Code 總感覺我的寫法好像走了歪路...
kingdragon wrote:
這東西好難寫,目前只...(恕刪)

為什麼你不使用WebClient本身所公開的非同步呼叫相關的方法??..

不要另外自行處理非同步呼叫來整死自己...
MSDN是你的好朋友...
vxr wrote:
為什麼你不使用Web...(恕刪)

擷取進度與狀態 還是需要自行呼叫非同步處裡吧
寫成 Class 後,反而不知道怎麼回報下載狀態
http://pastebin.com/3ZyVDtrr
kingdragon wrote:
擷取進度與狀態 還是...(恕刪)

請參閱MSDN公開的%ProgressChanged event handler...
另外, 你可以使用lambda運算式精簡event handler的委派..
http://msdn.microsoft.com/zh-tw/library/bb397687.aspx
如果你的方法只會參照一次..
可以改用匿名方法結合lambda運算式進行操作...

雖然這不是甚麼很必要..
不過不需要DataTable物件..
因為他是弱型資料物件..
為了展性更強的可讀性..
你可以自行撰寫資料物件封裝...
然後再加入到一個collection物件..
vxr wrote:
不過不需要DataTable物件

感謝前輩相助
http://pastebin.com/PY3xM4Sc

每個的檔案大小都不一樣,取下載進度太麻煩了
反正我只是要抓HTML與圖片,檔案都很小,只要知道已下載數就好

雖然我沒有遇到問題
但是否有必要限制同時下載數
kingdragon wrote:
感謝前輩相助http...(恕刪)

你的代碼有一些問題需要改善:
1. 可在精簡以及避免邏輯泥藻減少代碼維護上的困擾.
2. 請將資料物件與所在業務類別拆開.
3. WebClient建立一次就好了.
4. 可將資料物件傳入UserState. 在非同步事件發生時, 可拿來做利用.

你全部方法都加入static的修飾詞, 顯然這是毫無必要的...
因為這全部都不是甚麼工具方法, 也不是類似甚麼工廠(Factory)物件生成的策略(Strategy)...

這個類別的代碼依然可以做更多改善...
比方說可以簡化到剩下幾種方法:
1. AttachFile(string source, string dirPath, string fileName) //附加檔案至集合
2. BeginDownload() //retry操作可以合併到這邊
3. DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) //非同步事件

盡可能讓一個類別所承擔的"責任"愈單純愈好...
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!