我正在使用 Amazon S3 Transfer Utility(用于 .Net)。目前,我正在使用 .BeginUpload() 函数创建一个异步线程来上传文件,同时我的主线程继续处理。
但是,我遇到了一个问题,TransferUtility 偶尔会抛出错误,取消上传。似乎线程偶尔会完全中止(没有记录任何 log4net 异常)。
因此,我正在重新考虑用于使上传异步的方法。我看到两个选项:
- BeginUpload(),获取 IAsyncResult,启动一个新线程,立即调用 .EndUpload(result)
- 生成一个直接调用 .Upload 的新线程(而不是 .BeginUpload())。
我的问题:
如果我启动一个新线程来上传队列,它会以与 .BeginUpload()/.EndUpload() 调用相同的方式工作吗?
换句话说:
IAsyncResult ar = myTransferUtility.BeginUpload(uploadRequest);
ThreadPool.QueueUserWorkItem(c => {
try
{
myTransferUtility.EndUpload(ar);
}
catch (Exception ex)
{
handleException(ex, "Asynch Uploading");
}
});
相对
ThreadPool.QueueUserWorkItem(c => {
try
{
myTransferUtility.Upload(uploadRequest);
}
catch (Exception ex)
{
handleException(ex, "Asynch Uploading");
}
});
有什么不同?
(有一个 UploadCompleted 回调,当这些罕见的异常/中止发生时并不总是被调用。这个回调是我想要保证发生的。它会在“catch”中。)