Tôi đã có một tình huống gần đây, nơi tôi có một bộ điều khiển ASP.NET WebAPI cần thiết để thực hiện hai yêu cầu web cho một dịch vụ REST khác bên trong phương thức hành động của nó. Tôi đã viết mã của tôi để có chức năng tách sạch vào phương pháp riêng biệt, trông hơi giống như ví dụ sau:Cách hoạt động của chuỗi cuộc gọi async/await trả về?
public class FooController : ApiController
{
public IHttpActionResult Post(string value)
{
var results = PerformWebRequests();
// Do something else here...
}
private IEnumerable<string> PerformWebRequests()
{
var result1 = PerformWebRequest("service1/api/foo");
var result = PerformWebRequest("service2/api/foo");
return new string[] { result1, result2 };
}
private string PerformWebRequest(string api)
{
using (HttpClient client = new HttpClient())
{
// Call other web API and return value here...
}
}
}
Bởi vì tôi đã sử dụng HttpClient
tất cả các yêu cầu web phải được async. Tôi đã không bao giờ được sử dụng async/await trước khi vì vậy tôi bắt đầu ngây thơ thêm vào các từ khóa. Đầu tiên tôi thêm từ khóa async
vào phương thức PerformWebRequest(string api)
nhưng sau đó người gọi phàn nàn rằng phương pháp PerformWebRequests()
phải là async
để sử dụng await
. Vì vậy, tôi đã thực hiện điều đó async
nhưng bây giờ người gọi của phương pháp đó phải là async
quá, v.v.
Những gì tôi muốn biết là cách xa lỗ thỏ phải mọi thứ được đánh dấu async
để hoạt động? Chắc chắn sẽ có một điểm mà một cái gì đó phải chạy đồng bộ, trong trường hợp đó được xử lý một cách an toàn như thế nào? Tôi đã đọc rằng gọi Task.Result
là một ý tưởng tồi bởi vì nó có thể gây ra deadlocks.
Tôi đang tranh luận xem điều này có đủ điều kiện là trùng lặp hay không: http://stackoverflow.com/questions/9208921/async-on-main-method-of-console-app – spender
bạn có thể xem video tuyệt vời này về tính năng không đồng bộ trên kênh9 - http://channel9.msdn.com/events/TechDays/Techdays-2014-the-Netherlands/Async-programming-deep-dive – terrybozzio
Một tài nguyên tuyệt vời khác là loạt bài đăng trên blog của Eduasync của Jon Skeet http: // codeblog. jonskeet.uk/category/eduasync/ – softveda