我正在測試連接到Azure Blob存儲的我的WPF應用程序,以使用TPL(任務)下載一堆圖像。 預計在Live環境中,在部署的位置會有高度瞬時的互聯網連接。Azure StorageClient瞬態連接測試 - 掛起
我已經設置重試政策和BlobRequestOptions如下超時:
//Note the values here are for test purposes only
//CloudRetryPolicy is a custom method returning adequate Retry Policy
// i.e. retry 3 times, wait 2 seconds between retries
blobClient.RetryPolicy = CloudRetryPolicy(3, new TimeSpan(0, 0, 2));
BlobRequestOptions bro = new BlobRequestOptions() { Timeout = TimeSpan.FromSeconds(20) };
blob.DownloadToFile(LocalPath, bro);
上述聲明是在按預期後臺任務,我在後臺任務適當的異常處理和後續任務。
爲了測試異常處理和我的恢復代碼,我通過拉出網線來模擬互聯網斷開。我已經在UI線程上連接了System.Net.NetworkChange.NetworkAvailabilityChanged事件的方法,並且可以檢測到連接/斷開連接,並相應地更新UI。
我的問題是:如果我在下載文件時通過網絡連接線(通過blob.DownloadToFile),後臺線程掛起。它不超時,不崩潰,不拋出異常,沒有什麼!在我寫的時候,我一直在等待〜30分鐘,並且沒有對後臺任務進行響應/處理。
如果我拔下網線,在下載開始之前,執行過程與預期一致。即我可以看到重試發生,異常提出並通過,等等。
有沒有人遇到類似的行爲?任何提示/建議來克服這種行爲/問題?
順便說一下,我知道我可以取消檢測網絡連接丟失的下載任務,但我不想這樣做,因爲網絡連接可以在超時期限和下載過程中恢復可以從中斷的地方繼續。我測試了這種自動恢復功能,效果很好。
下面是我的代碼結構的粗略指示(語法上不正確的,只是一個流量指示)
btnClick()
{
declare background_task
attach continuewith_task to background task
start background task
}
background_task()
{
try
{
... connection setup ...
blob.DownloadToFile(LocalPath, bro);
}
catch(exception ex)
{
... exception handling ....
// in case of connectivity loss while download is in progress
// this block is not getting executed
// debugger just sits idle without a current statement
}
}
continuewith_task()
{
check if antecedent task is faulted
{
... do recovery work ...
// this is working as expected if connectivity is lost
// before download starts
// this task does not get called if connectivity is lost
// while file transfer is taking place
}
else
{
.. further processing ...
}
}
感謝您的幫助@AvkashChauhan。當你說'優雅地移除網絡'時我不明白。我如何測試這樣的事件? –
我正在考慮實現的是:只有在連接沒有恢復的情況下,在等待X個時間量(這比我的服務器超時更多的陰影)之後,啓動另一個網絡斷開連接檢測的後臺任務並取消下載任務。 –