ฉันมีวิธีการในแอปพลิเคชัน ASP.NET ซึ่งใช้เวลาค่อนข้างมากในการดำเนินการ การเรียกใช้เมธอดนี้อาจเกิดขึ้นได้สูงสุด 3 ครั้งระหว่างคำขอของผู้ใช้หนึ่งครั้งขึ้นอยู่กับสถานะแคชและพารามิเตอร์ที่ผู้ใช้ระบุ การโทรแต่ละครั้งจะใช้เวลาประมาณ 1-2 วินาทีจึงจะเสร็จสมบูรณ์ วิธีนี้เป็นการโทรแบบซิงโครนัสไปยังบริการและไม่มีความเป็นไปได้ที่จะลบล้างการใช้งาน
ดังนั้นการโทรแบบซิงโครนัสไปยังบริการจึงมีลักษณะดังนี้:
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
และการใช้วิธีการคือ (โปรดทราบว่าการเรียกใช้เมธอดนั้นอาจเกิดขึ้นมากกว่าหนึ่งครั้ง):
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
ฉันพยายามเปลี่ยนการใช้งานจากด้านข้างของฉันเพื่อให้สามารถใช้งานวิธีนี้ได้พร้อมกันและนี่คือสิ่งที่ฉันทำจนถึงตอนนี้
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
การใช้งาน (ส่วนหนึ่งของโค้ด "ทำอย่างอื่น" ทำงานพร้อมกันกับการเรียกใช้บริการ):
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
คำถามของฉันมีดังต่อไปนี้ ฉันใช้แนวทางที่ถูกต้องเพื่อเร่งการดำเนินการในแอปพลิเคชัน ASP.NET หรือฉันกำลังทำงานที่ไม่จำเป็นพยายามเรียกใช้รหัสซิงโครนัสแบบอะซิงโครนัส ใครสามารถอธิบายได้ว่าทำไมแนวทางที่สองจึงไม่ใช่ตัวเลือกใน ASP.NET (ถ้าไม่ใช่จริงๆ) นอกจากนี้หากใช้แนวทางดังกล่าวได้ฉันจำเป็นต้องเรียกใช้วิธีการดังกล่าวแบบอะซิงโครนัสหรือไม่หากเป็นการโทรเพียงครั้งเดียวที่เราอาจดำเนินการในขณะนี้ (ฉันมีกรณีเช่นนี้เมื่อไม่มีสิ่งอื่นที่ต้องทำในขณะที่รอให้เสร็จสิ้น)
บทความส่วนใหญ่ในเน็ตในหัวข้อนี้ครอบคลุมถึงการใช้async-await
วิธีการกับโค้ดซึ่งมีawaitable
วิธีการอยู่แล้วแต่นั่นไม่ใช่กรณีของฉัน ที่นี่เป็นบทความที่ดีที่อธิบายกรณีของฉันซึ่งไม่ได้อธิบายถึงสถานการณ์ของการโทรแบบขนานการปฏิเสธตัวเลือกในการตัดการโทรแบบซิงค์ แต่ในความคิดของฉันสถานการณ์ของฉันเป็นไปตามโอกาสที่จะทำ
ขอบคุณล่วงหน้าสำหรับความช่วยเหลือและเคล็ดลับ
Task.Run
เนื้อหาจะถูกรันในเธรดอื่นซึ่งนำมาจากเธรดพูล จากนั้นไม่จำเป็นต้องรวมสายที่ปิดกั้น (เช่นการโทรไปยังบริการของฉัน) ลงในRun
s เพราะพวกเขาจะใช้เธรดหนึ่งเธรดเสมอซึ่งจะถูกบล็อกระหว่างการดำเนินการของวิธีการ ในสถานการณ์เช่นนี้ผลประโยชน์เดียวที่เหลือasync-await
อยู่ในกรณีของฉันคือการดำเนินการหลายอย่างพร้อมกัน กรุณาแก้ไขฉันถ้าฉันผิด