【问题标题】:Stuck in UploadFromStream when disconnected from internet与 Internet 断开连接时卡在 UploadFromStream
【发布时间】:2013-02-05 11:06:10
【问题描述】:

我有一个try/catch方法,如下图。当互联网连接断开时,try 中的代码阻塞,不进入 catch,应用程序停止响应。当互联网连接恢复时,问题就消失了,一切正常。

这是我的代码的一部分:

using (var fileStream = System.IO.File.OpenRead(strLocatie))
{
    try
    {
        blobSAS.UploadFromStream(fileStream);
    }
    catch
    {
    }
}

我可以设置一个超时,这样当 try 块花费的时间超过 1000 毫秒时,代码会自动进入 catch?

整个方法:

public void uploadImages(string strLocatie, string naamBestand, string directoryname)
{
    try
    {
        string dag = DateTime.Now.Day.ToString();
        if (dag.Length == 1)
        {
            string temp = dag;
            dag = "0" + temp;
        }
        string maand = DateTime.Now.Month.ToString();
        if (maand.Length == 1)
        {
            string temp = maand;
            maand = "0" + temp;
        }
        if (signature == null)
        {
            getKey();
        }
        string datum = dag + "-" + maand + "-" + DateTime.Now.Year.ToString();
        CloudBlobClient blobClient = new CloudBlobClient(sUrl, new StorageCredentialsSharedAccessSignature(signature));
        CloudBlobContainer blobContainer = blobClient.GetContainerReference(container1);
        blobContainer.GetDirectoryReference(sUrl + container1);
        CloudBlockBlob blobSAS = new CloudBlockBlob(sUrl + container1 + "/" + directoryname + "/" + datum + "/" + naamBestand,
                        new StorageCredentialsSharedAccessSignature(signature));
        using (var fileStream = System.IO.File.OpenRead(strLocatie))
        {
            try
            {
                blobSAS.UploadFromStream(fileStream);
            }
            catch
            {
            }
        }
        File.Delete(strLocatie);
    }
    catch
    {
    }

}

如果互联网连接已经断开,在启动应用程序之前,catch 就完美了……

【问题讨论】:

  • 它的 blobSAS 类型是什么?
  • blobSAS 是一个 CloubBlockBlob
  • 您可以在尝试上传之前测试互联网连接,如果没有连接则跳过该部分代码。类似(这是伪代码) if(!InternetConnected) { Upload code } else { Catch code }
  • @Kobunite 如果在通话中互联网连接中断怎么办?
  • 然后应用程序停止响应

标签: c# winforms azure try-catch


【解决方案1】:

您可以在 blobClient 上设置超时

 var storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=<YOURACCOUNTNAME>;AccountKey=<YOURACCOUNTKEY>");
_blobClient = storageAccount.CreateCloudBlobClient();
_blobClient.Timeout = new System.TimeSpan(1,0,0);

然后,您还可以设置似乎将副本分散到多个线程的并行设置。如果你有大带宽,你可以增加下面的线程数,因为 Azure 接受按到达顺序分解成块的 blob。

_blobClient.ParallelOperationThreadCount = 2;

【讨论】:

    【解决方案2】:

    您必须设置 CloudBlockBlob 的 blobrequestoptions。在这里您可以设置超时。但是,最好在后台工作人员中上传文件。这样,您的应用程序始终是响应式的。

    blobrequestoptions

    【讨论】:

      【解决方案3】:

      有一个timeout property in the BlobRequestOptions 来自对UploadFromStream 的重载调用。

      是否可以指定超时,例如:

      BlobRequestOptions blobRequestOptions = new BlobRequestOptions();
      blobRequestOptions.Timeout = TimeSpan.FromSeconds(20.0)
      blobSAS.UploadFromStream(fileStream, blobRequestOptions);
      

      【讨论】:

        【解决方案4】:

        您可以为与CloudBlockBlob 关联的CloudBlobClient 上的请求指定Timeout。默认值为 90 秒。

        CloudBlockBlob 提供属性ServiceClient 来访问 CloudBlobClient 的实例

        但我不确定这是否能解决您的问题。

        您也可以尝试使用BackgroundWorker 将您的流上传到云端,以便您的应用程序负责并在后台上传数据。

        CloudBlockBlob 类也提供方法BeginUploadFromStreamEndUploadFromStream 来异步上传数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-16
          • 2010-10-09
          • 1970-01-01
          • 1970-01-01
          • 2020-11-27
          • 2018-03-23
          相关资源
          最近更新 更多