0

コンソールアプリケーションで次のコードを使用しましたが、Console.Read()を使用するまでポストコールは終了しません。最後にまたはクライアント.PostAsync( "api/xxx"、contentPost).wait()。 しかし、Webアプリケーションでは、wait()メソッドを使用する必要はありません。私はwait()メソッドを使いたいとは思っていません。この問題を手伝ってもらえますか?なぜHttpClient.PostAsync()はCosnoleアプリケーションで終了せずにWebアプリケーションで終了しましたか?

static void Main(string[] args) 
    { 
     CreateLog(); 

    } 
    private static void CreateLog() 
    { 

     for(int i=0;i<100;i++) 
     ProcessLog(new LogMessage() { 
     }); 
     Console.Write("Press Enter to exit"); 
     Console.ReadLine(); 

    } 
    private static void ProcessLog(LogMessage message) 
    { 


     //Post message to web service 
     HttpClient client = new HttpClient(); 
     // ConfigurationSettings.GetConfig("web api") 
     client.BaseAddress = new Uri(@"web api url"); 
     client.DefaultRequestHeaders.Accept.Add(
      new MediaTypeWithQualityHeaderValue("application/json"));     
     HttpContent contentPost = new StringContent(JsonConvert.SerializeObject(message), Encoding.UTF8, "application/json"); 
     client.PostAsync("api/xxx", contentPost); 
    } 

答えて

0

これは、race conditionの古典的な例です。あなたはConsoleアプリケーションの前にこれを頼りにしていますが、それが実際に起こることは保証されていません。実際には、あなたが投稿したコードでは、にほぼ確実にには、Console.Write()呼び出しが完了するまでに完了していない多数の呼び出しがあります。

ここでの違いは、入力するために何かキーを押した直後にコンソールアプリケーションが終了するという点です。 Console.Read()はとして事実上 Wait()コールとして機能しますが、ユーザーが実際にすべての呼び出しを完了するのに十分長い間待機することは絶対にありません。 Webアプリケーションは、コンソールアプリケーションとはまったく異なるライフサイクルを持つため、通話を終了するとすぐに閉じる必要はありません。

終了する前に、すべての通話が完了するまで待つ必要があります。

+0

はい。この問題の解決方法は何ですか?Console.Read()は回避策ですが、使用したくありません。 – Gangz

+0

アプリケーションを終了する前に、すべての通話が完了するまで待つ必要があります。 – EJoshuaS

+0

アクティブな通話があるかどうかを確認するにはどうすればいいですか? – Gangz

関連する問題