Tôi có một phương thức trong ứng dụng ASP.NET, tiêu tốn khá nhiều thời gian để hoàn thành. Một lệnh gọi đến phương thức này có thể xảy ra tối đa 3 lần trong một yêu cầu của người dùng, tùy thuộc vào trạng thái bộ nhớ cache và các tham số mà người dùng cung cấp. Mỗi cuộc gọi mất khoảng 1-2 giây để hoàn thành. Bản thân phương thức là lời gọi đồng bộ tới dịch vụ và không có khả năng ghi đè việc triển khai.
Vì vậy, cuộc gọi đồng bộ đến dịch vụ trông giống như sau:
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
Và cách sử dụng phương thức là (lưu ý, việc gọi phương thức đó có thể xảy ra nhiều lần):
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
Tôi đã cố gắng thay đổi cách triển khai từ phía mình để cung cấp công việc đồng thời của phương pháp này và đây là những gì tôi đã đạt được cho đến nay.
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
Cách sử dụng (một phần của mã "làm việc khác" chạy đồng thời với lệnh gọi đến dịch vụ):
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
Câu hỏi của tôi là như sau. Tôi có sử dụng phương pháp phù hợp để tăng tốc độ thực thi trong ứng dụng ASP.NET hay tôi đang thực hiện công việc không cần thiết khi cố gắng chạy mã đồng bộ không đồng bộ? Bất cứ ai có thể giải thích tại sao cách tiếp cận thứ hai không phải là một tùy chọn trong ASP.NET (nếu nó thực sự không phải)? Ngoài ra, nếu cách tiếp cận như vậy có thể áp dụng, tôi có cần gọi phương thức không đồng bộ như vậy không nếu đó là lệnh gọi duy nhất mà chúng tôi có thể thực hiện vào lúc này (tôi gặp trường hợp như vậy, khi không có việc nào khác phải làm trong khi chờ hoàn thành)?
Hầu hết các bài viết trên mạng về chủ đề này đều đề cập đến việc sử dụng cách async-await
tiếp cận với mã, đã cung cấp awaitable
các phương pháp, nhưng đó không phải là trường hợp của tôi. Đâylà bài viết hay mô tả trường hợp của tôi, không mô tả tình huống của các cuộc gọi song song, từ chối tùy chọn kết thúc cuộc gọi đồng bộ, nhưng theo ý kiến của tôi, tình huống của tôi chính xác là cơ hội để làm điều đó.
Cảm ơn trước cho sự giúp đỡ và lời khuyên.
Task.Run
, nội dung được chạy trong một luồng khác, được lấy từ nhóm luồng. Sau đó, không cần thiết phải gói các cuộc gọi chặn (chẳng hạn như lệnh gọi đến dịch vụ của tôi) thànhRun
s, bởi vì chúng sẽ luôn sử dụng mỗi luồng một, sẽ bị chặn trong khi thực thi phương thức. Trong tình huống như vậy, lợi ích duy nhất còn lạiasync-await
trong trường hợp của tôi là thực hiện một số hành động cùng một lúc. Vui long sửa cho tôi nêu tôi sai.