1

我正在使用 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”中。)

4

0 回答 0