0

以下に示すように、try/catchメソッドがあります。インターネット接続がダウンすると、コードはtryでブロックされ、catchに入力されず、アプリケーションは応答を停止します。インターネット接続が回復すると、問題は解消され、すべてが正常に機能します。

これは私のコードの一部です:

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

tryブロックに1000ms以上かかる場合、コードが自動的にキャッチに移動するようにタイムアウトを設定できますか?

全体の方法:

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
    {
    }

}

そして、インターネット接続がすでにダウンしている場合は、アプリケーションを開始する前に、キャッチは完璧に機能します...

4

4 に答える 4

2

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;
于 2013-02-05T11:25:13.607 に答える
1

に関連付けられている で要求のタイムアウトを指定できます。デフォルト値は 90 秒です。CloudBlobClientCloudBlockBlob

ServiceClientCloudBlockBlob は、 CloudBlobClient のインスタンスにアクセスするためのプロパティを提供します

しかし、これで問題が解決するかどうかはわかりません。

また、 BackgroundWorkerを使用してストリームをクラウドにアップロードすることもできます。これにより、アプリケーションが責任を持ち、バックグラウンドでデータをアップロードできます。

また、クラス CloudBlockBlob は、データを非同期にアップロードするためのメソッドBeginUploadFromStreamおよびEndUploadFromStreamを提供します。

于 2013-02-05T11:25:28.190 に答える
1

CloudBlockBlob の blobrequestoptions を設定する必要があります。ここでタイムアウトを設定できます。ただし、バックグラウンドワーカーでファイルをアップロードする方がよいでしょう。このようにして、アプリケーションは常に応答します。

ブローリクエストオプション

于 2013-02-05T11:25:39.763 に答える
1

へのオーバーロードされた呼び出しからの sには、タイムアウト プロパティBlobRequestOptionがありUploadFromStreamます。

次のようなタイムアウトを指定すると機能しますか?

BlobRequestOptions blobRequestOptions = new BlobRequestOptions();
blobRequestOptions.Timeout = TimeSpan.FromSeconds(20.0)
blobSAS.UploadFromStream(fileStream, blobRequestOptions);
于 2013-02-05T11:26:13.570 に答える