与互联网断开连接时,卡在UploadFromStream中

本文关键字:卡在 UploadFromStream 互联网 断开 连接 | 更新日期: 2023-09-27 17:57:58

我有一个try/catch方法,如下所示。当互联网连接断开时,代码会在try中阻塞,并且不会输入catch,应用程序也会停止响应。当互联网连接恢复时,问题就消失了,一切都很好。

这是我代码的一部分:

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

我可以设置一个超时,这样当try块花费超过1000ms时,代码就会自动进入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会完美工作。。。

与互联网断开连接时,卡在UploadFromStream中

您可以在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;

您必须设置CloudBlockBlob的blobrequestoptions。在这里你可以设置一个超时。然而,最好在后台工作人员中上传文件。通过这种方式,您的应用程序始终具有响应能力。

blobrequestoptions

BlobRequestOption s中有一个从重载调用到UploadFromStream的超时属性。

它能指定超时吗,比如:

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

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

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

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

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

CloudBlockBlob类还提供了BeginUploadFromStream和EndUploadFromStream方法来异步上传数据。