2016-09-15 25 views
5

Tôi hoàn toàn mới sử dụng các cuộc gọi không đồng bộ và đang chờ. Tôi có bên dưới chức năng đơn vị kiểm tra:Console.WriteLine sau khi async đang chờ cuộc gọi.

public async static void POSTDataHttpContent(string jsonString, string webAddress) 
    { 
     HttpClient client = new HttpClient(); 
     StringContent stringContent = new StringContent(jsonString); 
     HttpResponseMessage response = await client.PostAsync(
      webAddress, 
      stringContent); 

     Console.WriteLine("response is: " + response); 
    } 

Bài kiểm tra hoàn thành mà không có lỗi, nhưng tôi không bao giờ thấy Console.WriteLine tuyên bố in hiển thị trong đầu ra - Tôi không chắc chắn lý do tại sao. Tôi đã nhìn xung quanh và có vẻ như tôi có thể cần thiết lập điều này như một nhiệm vụ? Ai đó có thể chỉ cho tôi đúng hướng không?

+3

Những khuôn khổ kiểm tra bạn đang sử dụng? Micrsoft của riêng hoặc NUnit? Bạn có thể muốn thay đổi kiểu trả về thành 'Task' –

+2

Bạn có thể muốn thay đổi kiểu trả về thành Task (không làm mất hiệu lực - không bao giờ sử dụng void làm kiểu trả về nếu bạn có thể giúp nó); bạn sẽ không thể chờ đợi nó được. Ngoài ra, đặt HttpClient trong một khối sử dụng. – EJoshuaS

+2

Tôi đang sử dụng Microsoft. – Roka545

Trả lời

3

Vì bạn đang chờ đợi một HttpResponseMessage, một giải pháp đơn giản (và nhất quán) là trả lại Task<HttpResponseMessage>.

var x = await POSTDataHttpContent("test", "http://api/"); 

public async Task<HttpResponseMessage> POSTDataHttpContent(
    string jsonString, string webAddress) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     StringContent stringContent = new StringContent(jsonString); 
     HttpResponseMessage response = await client.PostAsync(
     webAddress, 
     stringContent); 

     Console.WriteLine("response is: " + response); 

     return response; 
    } 
} 

Điều đó nói rằng, bạn cũng cần đảm bảo rằng thiết lập thử nghiệm của bạn là chính xác. Bạn không thể gọi đúng phương thức không đồng bộ từ một thử nghiệm đồng bộ. Thay vào đó, hãy đánh dấu thử nghiệm của bạn async và đợi phương thức bạn đang gọi. Hơn nữa, phương pháp thử nghiệm của bạn phải được đánh dấu là async Task cũng vì cả MS cũng không Test Runner các công cụ khác (NCrunch, NUnit) sẽ đúng cách đối phó với một phương pháp thử nghiệm khoảng trống async:

[TestMethod] 
public async Task TestAsyncHttpCall() 
{ 
    var x = await POSTDataHttpContent("test", "http://api/"); 
    Assert.IsTrue(x.IsSuccessStatusCode); 
} 
1

Tôi nghĩ rằng điều tốt nhất để làm ở đây cho bạn là lựa chọn loại trả về Task thay vì một khoảng trống.

public async Task POSTDataHttpContent(string jsonString, string webAddress) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     StringContent stringContent = new StringContent(jsonString); 
     HttpResponseMessage response = await client.PostAsync(
      webAddress, 
      stringContent); 

     // Assert your response may be? 
    }   
} 

Và nếu bạn thực sự cứng rắn về việc không sử dụng Công việc (mà không phải là một ý tưởng tốt):

public void POSTDataHttpContent(string jsonString, string webAddress) 
{ 
    var Task = Task<HttpResponseMessage>.Run(async() => { 
     using (HttpClient client = new HttpClient()) 
     { 
      StringContent stringContent = new StringContent(jsonString); 
      HttpResponseMessage response = await client.PostAsync(
       webAddress, 
       stringContent); 


      return response; 
     } 
    }); 

    Task.Wait(); 
    Assert.IsNotNull(Task.Result); 
} 
Các vấn đề liên quan