4
ทางออกที่ดีสำหรับการรอคอยในการลอง / จับ / ในที่สุด?
ฉันต้องเรียกใช้asyncเมธอดในcatchบล็อกก่อนที่จะโยนข้อยกเว้นอีกครั้ง (ด้วยการติดตามสแต็ก) เช่นนี้ try { // Do something } catch { // <- Clean things here with async methods throw; } แต่น่าเสียดายที่คุณไม่สามารถใช้awaitใน a catchหรือfinallyblock ได้ ฉันได้เรียนรู้ว่าเป็นเพราะคอมไพเลอร์ไม่มีทางย้อนกลับไปในcatchบล็อกเพื่อดำเนินการตามawaitคำสั่งของคุณหรืออะไรทำนองนั้น ... ฉันพยายามใช้Task.Wait()เพื่อแทนที่awaitและฉันมีการหยุดชะงัก ฉันค้นหาบนเว็บว่าฉันจะหลีกเลี่ยงปัญหานี้ได้อย่างไรและพบไซต์นี้ เนื่องจากฉันไม่สามารถเปลี่ยนasyncวิธีการและฉันไม่รู้ว่าพวกเขาใช้ConfigureAwait(false)หรือไม่ฉันจึงสร้างวิธีการเหล่านี้ขึ้นมาซึ่งใช้วิธีFunc<Task>เริ่มต้นวิธี async เมื่อเราอยู่ในเธรดอื่น (เพื่อหลีกเลี่ยงการหยุดชะงัก) และรอให้มันเสร็จสิ้น: public static void AwaitTaskSync(Func<Task> action) { Task.Run(async () => await action().ConfigureAwait(false)).Wait(); } public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> …