ASP.NET uygulamasında tamamlanması oldukça fazla zaman harcayan bir yöntemim var. Bu yönteme bir çağrı, kullanıcının sağladığı önbellek durumuna ve parametrelere bağlı olarak, bir kullanıcı isteği sırasında en fazla 3 kez gerçekleşebilir. Her aramanın tamamlanması yaklaşık 1-2 saniye sürer. Yöntemin kendisi hizmete eşzamanlı bir çağrıdır ve uygulamayı geçersiz kılma olasılığı yoktur.
Dolayısıyla, hizmete yapılan eşzamanlı çağrı şuna benzer:
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
Ve yöntemin kullanımı (not, bu yöntem çağrısı birden fazla olabilir):
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
Bu yöntemin eşzamanlı çalışmasını sağlamak için uygulamayı kendi tarafımdan değiştirmeye çalıştım ve şimdiye kadar geldiğim şey bu.
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
Kullanım ("başka şeyler yap" kodunun bir parçası, hizmet çağrısıyla aynı anda çalışır):
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
Sorum şu. ASP.NET uygulamasında yürütmeyi hızlandırmak için doğru yaklaşımı mı kullanıyorum yoksa senkronize kodu senkronize olmayan bir şekilde çalıştırmaya çalışırken gereksiz iş mi yapıyorum? İkinci yaklaşımın ASP.NET'te neden bir seçenek olmadığını (eğer gerçekten değilse) kimse açıklayabilir mi? Ayrıca, böyle bir yaklaşım uygulanabilirse, şu anda gerçekleştirebileceğimiz tek çağrı ise bu yöntemi eşzamansız olarak çağırmam gerekir mi (Böyle bir durumum var, tamamlanmasını beklerken yapacak başka bir şey yokken)?
Bu konuyla ilgili ağdaki makalelerin çoğu, async-await
zaten awaitable
yöntemler sağlayan kodla yaklaşımın kullanılmasını kapsar , ancak bu benim durumum değil. Burayaparalel aramaların durumunu tanımlamayan, senkronizasyon aramasını sarma seçeneğini reddeden durumumu açıklayan güzel bir makale, ama bence benim durumum tam olarak bunu yapma fırsatı.
Yardım ve ipuçları için şimdiden teşekkürler.
Task.Run
, içerik iş parçacığı havuzundan alınan başka bir iş parçacığında çalıştırılıyor. Bu durumda, engelleme çağrılarını (hizmete benim hizmet çağrısı gibi)Run
s içine sarmaya gerek kalmaz , çünkü bunlar her zaman her biri bir iş parçacığı tüketecek ve yöntemin yürütülmesi sırasında engellenecektir. Böyle bir durumdaasync-await
benim durumumda kalan tek fayda, aynı anda birkaç eylemde bulunmaktır. Yanılıyorsam lütfen beni düzeltin.