2017-12-19 12 views
1

Webクライアントを使用してリクエストパラメータをサーバに送信し、リクエストに応じて応答します。しかし、私がウェブクライアントのリクエストを送信しようとするたびに私が直面する問題は、リクエストを送信中にインターネットが切断されると、アプリケーションがハングすることになります。場合によってはアプリケーションがクラッシュすることがあります。 私のコードスニペットは以下の通りです。インターネットを切断して実行中にウェブクライアントの要求がハングアップする場合

WebClient webClient=new WebClient() 
    userData = webClient.UploadValues(URL, "POST", parameters); 

         ` 

インターネットが切断された場合にその行を実行すると、アプリケーションがハングアップします。

+0

あなたは答えがありますが、非同期メソッド '.UploadValuesAsync'に切り替えて、プロセスからUIを切り離し、操作の進行状況に関する通知を受け取ることもお勧めします[UploadProgressChangedイベント](https:///msdn.microsoft.com/en-us/library/system.net.webclient.uploadprogresschanged(v=vs.110).aspx)。 [NetworkAvailabilityChangedイベント](https://msdn.microsoft.com/en-us/library/system.net.networkinformation.networkchange.networkavailabilitychanged.aspx)も参照してください。利用可能なネットワーク接続がない場合に通知を受信するイベントを登録します。 – Jimi

+0

@ジミあなたは私に'UploadValuesAsync 'の使用を提案します。それは仕事ですが、何も返されず、私はバイト形式で応答します。レスポンスに応じて、さまざまなタスクを実行します。そのような状況に対処してください。おかげさまで –

+0

WebClientイベント[UploadValuesCompletedEventHandler](https://docs.microsoft.com/en-us/dotnet/api/system.net.uploadvaluescompletedeventhandler?view=netframework-4.7)を登録します。アップロードが完了すると、[UploadValuesCompletedEventArgs](https://docs.microsoft.com/en-us/dotnet/api/system.net.uploadvaluescompletedeventargs?view=netframework-4.7) 'e.Result'には、サーバーをバイト配列で表します。また、 'e.Error'と' e.Cancelled'(今回は2 "L")を返します。 – Jimi

答えて

0
private class YourWebClient : WebClient 
     { 
      protected override WebRequest GetWebRequest(Uri uri) 
      { 
       WebRequest wr = base.GetWebRequest(uri); 
       wr.Timeout = 7 * 1000; 
       return wr; 
      } 
     } 

。私はそれをテストし、それは私のために働いた。実際にはwebclientのデフォルトのタイムアウトは100秒ですが、デフォルトでは約20〜25または30秒かかります。サーバーからどれくらいの時間がかかっているかを知っていることに応じて、それを変更します。 threadsをこのコードの作業に使用することもできます。UIはハングしません。

希望すると助かります。

0

WebClientを拡張するとタイムアウトになります。これを試してください:あなたはあなたの欲求に応じて、あなたのタイムアウトを変更することができます

class WebClientWithTimeout : WebClient { 
    public WebClientWithTimeout(int timeout) { 
    _timeout = timeout 
    } 
    // Timeout in seconds 
    int _timeout; 
    protected override WebRequest GetWebRequest(Uri uri) { 
    WebRequest webRequest = base.GetWebRequest(uri); 
    webRequest.Timeout = 1000 * _timeout; 
    return w; 
    } 
} 
+0

申し訳ありません申し訳ありませんが、私は多くの情報を提供していないので、あなたは私の質問を誤解しています。親愛なるアプリケーションがしばらくぶら下がり、例外がスローされます。インターネットが切断された場合は、そのコード行を処理した時点で終了します(可能な場合)。 ありがとう –

+0

私は本当に理解していません。インターネット接続を確認する一般的な方法はありません。タイムアウト時に例外が必要な場合は、それに応じてサンプルコードを変更してください。 –

関連する問題