2012-03-26 21 views
5

HttpWebient API Web ASP.NET mới đã mang lại cho tôi một số kết quả lạ. Đây là mã của tôi:HttpClient GetStringAsync - Nó không bao giờ trở lại

class Program { 

    static async void Main(string[] args) { 

     var address = "http://localhost:3895/api/urls"; 

     Console.WriteLine(await getStringAsync(address)); 
     Console.ReadLine(); 

    } 

    public static async Task<string> getStringAsync(string uri) { 

     var httpClient = new HttpClient(); 
     return await httpClient.GetStringAsync(uri); 
    } 
} 

Điều này không bao giờ trở lại và bảng điều khiển đột nhiên xuất hiện và biến mất. Khi tôi thay đổi mã như dưới đây, nó hoạt động như được cho là:

static void Main(string[] args) { 

    var address = "http://localhost:3895/api/urls"; 

    Console.WriteLine(getString(address)); 
    Console.ReadLine(); 

} 

public static string getString(string uri) { 

    var httpClient = new HttpClient(); 

    return httpClient.GetStringAsync(uri).Result; 
} 

Bất kỳ ý tưởng nào về vấn đề này sẽ là gì?

+1

Điều đó thậm chí không biên dịch được. Một điểm vào ('Main') không thể không đồng bộ. Nó sẽ thất bại với lỗi CS4009. – vcsjones

+0

@vcsjones Trong CTP Async được phép (nhưng ý tưởng tồi) – hvd

+1

@hvd Thú vị. Tốt nhất là họ không cho phép nó ngay bây giờ. – vcsjones

Trả lời

9

async trên Main không được phép trong trình biên dịch VS11/.NET 4.5, vì vậy tôi giả sử bạn đang sử dụng Async CTP. Nếu sử dụng .NET 4.5 là tùy chọn, hãy thực hiện chuyển đổi.

Điều đó sang một bên, lý do nó không hoạt động là vì async, hoặc thường hơn, nhiệm vụ, dựa vào việc có thể báo hiệu một số cách để phần còn lại của mã được thực thi. Nó hoạt động với .Result vì mã chạy đồng bộ, do đó, vấn đề không áp dụng.

Không có hỗ trợ tích hợp cho ứng dụng bảng điều khiển, vì chúng thường không sử dụng vòng tin nhắn theo cách mà WinForms làm, nhưng bạn có thể xem Microsoft Visual Studio Async CTP\Samples\(C# Testing) Unit Testing\AsyncTestUtilities, đặc biệt là GeneralThreadAffineContext.cs, để có ví dụ cơ bản hoạt động trong các ứng dụng giao diện điều khiển.

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