我有一個腳本,它貫穿數據庫表併爲每行下載文件,添加到內存中的結果表,然後批量上傳所有結果到數據庫一次完成。腳本以C#,SQL 2008下載數以千計的文件的最佳方法
我遇到的問題是可能會有數千個文件下載,並且腳本可能會在一半時間內超時或發生錯誤。
有沒有比這更好的方法,可能涉及線程或異步調用?
我有一個腳本,它貫穿數據庫表併爲每行下載文件,添加到內存中的結果表,然後批量上傳所有結果到數據庫一次完成。腳本以C#,SQL 2008下載數以千計的文件的最佳方法
我遇到的問題是可能會有數千個文件下載,並且腳本可能會在一半時間內超時或發生錯誤。
有沒有比這更好的方法,可能涉及線程或異步調用?
線程似乎是要走的路.. 你應該有一個或多個從db中讀取行的線程(如果你想要很多線程,你應該相應地分區讀取)並將它們放入某種併發收集(.net 4內置的,或建立/下載一個自定義的)。 那麼你應該有一個線程集合誰就會從該列表項並獲得文件,如果他超時,他應該把任務回到集合..
這是一個基本的生產者 - 消費者線程模式。 你可以在谷歌中輕鬆找到很多例子。
是否可以在每次下載操作後將結果保留回數據庫?通過這種方式,您可以比較兩個表的行,以便在出現某種超時或錯誤的情況下提取您離開的位置。線程可能使它更快,但它不會解決你問自己的問題。
如果你有足夠的時間來運行腳本(每天午夜運行一次等),那麼最簡單的解決方案是堅持每次X下載的數據庫。
也許這可能是一個很好的雲應用程序的候選人。帶寬,排隊異步處理,及時擴展?
如果超時的原因是要下載的文件的數量,我建議使用ThreadPool
進行異步調用。
首先,使用ThreadPool.SetMaxThreads
設置最大並行線程數。然後你可以用ThreadPool.QueueUserWorkItem
排列任務。這種做法將保證併發線程的最大數量。所有高於最大數量的數據將等待池中的線程完成。
我不會在腳本中執行此類操作。相反,我會有一些類型的程序,可能作爲Windows服務運行,這實際上會執行下載所有這些文件並更新相關記錄的工作。
如果它只是在用戶單擊按鈕時運行,那麼我會讓服務監視一個表以執行一個命令。一旦它檢測到該命令,然後啓動並去。
不確定模式名稱在這裏,但它基本上像一個工作排隊系統。
這並沒有回答阻止超時或錯誤並從中恢復的問題。 – 2010-03-02 13:47:17
是的,它確實如此,你不能防止超時,只是捕獲超時異常,並且當它確定將該項目返回給集合時,因此另一個線程將嘗試給出它。你甚至可以把它作爲一個更復雜的工作對象來實現,它跟蹤嘗試的數量等。 – MindFold 2010-03-02 14:35:36