我正在测试我的 WPF 应用程序连接到 Azure Blob 存储以使用 TPL(任务)下载一堆图像。预计在 Live 环境中,在已部署的位置将存在与 Internet 的高度瞬态连接。
我在 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 ...
}
}