การใช้รูปแบบการรอแบบ async จากวิธีคงที่เมื่อไม่ต้องการการทำงานพร้อมกัน

การใช้รูปแบบ async/await มีประโยชน์เมื่อคุณเรียกใช้สิ่งต่าง ๆ ในลักษณะซิงโครนัสหรือไม่?

ตัวอย่างเช่นในแอปของฉัน ฉันมีวิธีคงที่ที่ cron (hangfire) เรียกเพื่อทำงานต่างๆ ที่เชื่อมโยงกับ IO ตัวอย่างที่ประดิษฐ์ขึ้นอย่างง่ายคือ:

static void Run(string[] args)
{
    var data = Test(args);

    //..do stuff with returned data
}

public static List<string> Test(string[] args)
{
    return Db.Select(args);
}

มีข้อได้เปรียบในการเขียนโค้ดนี้หรือไม่:

static void Run(string[] args)
{

    var dataTask = await TestAsync(args);
    dataTask.Wait();

    //..do stuff with returned data
}

public static async Task<List<string>> TestAsync(string[] args)
{
    return await Db.SelectAsync(args);
}

เพื่อนร่วมงานของฉันบอกฉันว่าฉันควรใช้รูปแบบนี้เสมอและใช้วิธีการ async หากมีให้ใช้งานตามที่เพิ่มไว้ภายใต้การเพิ่มประสิทธิภาพขั้นสูง แต่เขาไม่สามารถอธิบายได้ว่าทำไมถึงเป็นเช่นนั้น และฉันไม่พบคำอธิบายที่ชัดเจนจริงๆ

ถ้าฉันเขียนโค้ดด้วยรูปแบบประเภทนี้ในวิธีการแบบคงที่ มันจะออกมาเป็นดังนี้:

var data = someMethod();
data.Wait();
var data2 = someOtherMethod(data);
data2.Wait();

ฉันเข้าใจว่าการใช้รูปแบบการรอแบบ async เมื่อเริ่มงานพร้อมกันจำนวนมาก แต่เมื่อโค้ดมาจากวิธีคงที่และต้องทำงานตามลำดับเช่นนี้ จะมีประโยชน์อะไรบ้าง ฉันควรจะเขียนมันด้วยวิธีใด?


person Guerrilla    schedule 10.11.2018    source แหล่งที่มา
comment
คุณ จริงๆ รวม await และ Wait() ในรหัสการผลิตหรือไม่ ถ้าเป็นเช่นนั้นทำไม?   -  person Peter Bons    schedule 10.11.2018
comment
อ๊ะ แก้ไขมันแล้ว ขอบคุณ   -  person Guerrilla    schedule 10.11.2018


คำตอบ (1)


เมื่อมันเพิ่มเข้ามาภายใต้การเพิ่มประสิทธิภาพประทุน แต่เขาไม่สามารถอธิบายได้ว่าทำไมถึงเป็นเช่นนั้น

เป็นเรื่องที่น่าทึ่งสำหรับฉันที่มีคนจำนวนไม่น้อยที่เชื่อว่า async เป็นตัวเลือกที่ดีที่สุดเสมอ แต่พวกเขาไม่สามารถบอกได้ว่าทำไม นี่เป็นความเข้าใจผิดครั้งใหญ่ในชุมชน น่าเสียดายที่ Microsoft กำลังผลักดันแนวคิดนี้ ฉันเชื่อว่าพวกเขากำลังทำเช่นนี้เพื่อทำให้คำแนะนำง่ายขึ้น

Async IO ช่วยได้สองสิ่ง: 1) บันทึกเธรด 2) ทำให้แอป GUI ง่ายขึ้นโดยยกเลิกการจัดการเธรด

แอปพลิเคชันส่วนใหญ่ไม่มีข้อจำกัดโดยสิ้นเชิงตามจำนวนเธรดที่กำลังทำงานอยู่ สำหรับแอปเหล่านั้น async IO จะเพิ่มปริมาณงานเป็นศูนย์ มีค่าใช้จ่าย CPU เพิ่มเติม และทำให้โค้ดซับซ้อน ฉันรู้เพราะฉันได้วัดปริมาณงานและความสามารถในการขยายขนาดแล้ว ฉันได้ทำงานกับแอปพลิเคชันมากมาย

โดยเฉพาะอย่างยิ่ง IO เองไม่ได้เร็วขึ้น สิ่งเดียวที่เปลี่ยนแปลงคือวิธีการเริ่มต้นและสิ้นสุดการโทร ไม่มีการเพิ่มประสิทธิภาพ IO ใดๆ ที่นี่

ใช้อะซิงก์เมื่อคุณสะดวกหรือคุณมีหลักฐานว่าจำนวนเธรดที่ทำงานอยู่จะเป็นปัญหา อย่าใช้มันเป็นค่าเริ่มต้นเนื่องจากประสิทธิภาพการทำงานจะลดลง มีวิธีเพิ่มเติมในการเพิ่มข้อบกพร่อง การใช้เครื่องมือแย่ลง โค้ดยาวกว่า การดีบักและการทำโปรไฟล์ยากกว่า

แน่นอนว่าการใช้มันไม่ใช่เรื่องผิดหากเป็นเครื่องมือที่เหมาะกับงาน

person usr    schedule 10.11.2018