2013-01-06 27 views
12

Mọi thứ đang hoạt động hôm nay cho đến khi nó dừng ... Dưới đây là mã nguồn tối thiểu (Tôi đang sử dụng Bản cập nhật VS 2012 1, .Net 4.5). Khi tôi chạy nó, ứng dụng thoát khi gọi client.PostAsync() và vì vậy nó không bao giờ đạt đến Console.ReadLine(). Tương tự trong trình gỡ lỗi, không có ngoại lệ, không có gì, mã thoát 0.HttpClient.PostAsync gõ ứng dụng có mã thoát 0

Tôi đã thử khởi động lại máy, khởi động lại VS2012 - không có gì hoạt động.

Một lần nữa, mọi thứ đang chạy ngày hôm nay, không chắc chắn những gì đã thay đổi (không có phần mềm nào được cài đặt vv, tất cả các ứng dụng mạng khác vẫn hoạt động).

Bất kỳ ý tưởng nào? Tôi nghĩ tôi đang mất trí.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Run(); 
    } 

    private async static void Run() 
    { 
     using (var client = new System.Net.Http.HttpClient()) 
     { 
      var headers = new List<KeyValuePair<string, string>> 
           { 
            new KeyValuePair<string, string>("submit.x", "48"), 
            new KeyValuePair<string, string>("submit.y", "15"), 
            new KeyValuePair<string, string>("submit", "login") 
           }; 

      var content = new FormUrlEncodedContent(headers); 

      HttpResponseMessage response = await client.PostAsync("http://www.google.com/", content); 

      Console.ReadLine(); 
     } 
    } 
} 

Trả lời

29

Vấn đề của bạn là chương trình thường thoát khi phương pháp Main() kết thúc. Và số Main() của bạn sẽ kết thúc ngay khi bạn nhấn await trong Run(), vì đó là cách thức hoạt động của phương thức async.

Bạn nên làm gì là làm cho Run() vào một phương pháp async Task và sau đó chờ cho Task trong Main() phương pháp của bạn:

static void Main() 
{ 
    RunAsync().Wait(); 
} 

private static async Task RunAsync() 
{ 
    … 
} 

vài lưu ý hơn:

  1. Bạn không bao giờ nên sử dụng async void phương pháp , trừ khi bạn phải (đó là trường hợp xử lý sự kiện async).
  2. Trộn awaitWait() trong ứng dụng GUI hoặc trong ASP.NET là nguy hiểm, vì nó dẫn đến deadlocks. Nhưng đó là giải pháp phù hợp nếu bạn muốn sử dụng async trong ứng dụng bảng điều khiển.
+5

+1. Như một mẹo, bạn có thể dễ dàng thực hiện 'try' /' catch' ở mức cao nhất trong 'RunAsync' thay vì' Main', vì 'Task.Wait' sẽ bọc các ngoại lệ trong' AggregateException'. –

Các vấn đề liên quan