ข้อมูลพื้นฐานเล็กน้อย
ฉันกำลังเรียนรู้ Web API stack และฉันกำลังพยายามห่อหุ้มข้อมูลทั้งหมดในรูปแบบของออบเจ็กต์ "Result" ด้วยพารามิเตอร์เช่น Success และ ErrorCodes
อย่างไรก็ตามวิธีการที่แตกต่างกันจะให้ผลลัพธ์และรหัสข้อผิดพลาดที่แตกต่างกัน แต่โดยทั่วไปวัตถุผลลัพธ์จะถูกสร้างอินสแตนซ์ในลักษณะเดียวกัน
เพื่อประหยัดเวลาและเรียนรู้เพิ่มเติมเกี่ยวกับความสามารถ async / await ใน C # ฉันพยายามที่จะรวมเนื้อหาวิธีการทั้งหมดของการกระทำเว็บ api ของฉันในตัวแทนการกระทำแบบอะซิงโครนัส แต่ติดอยู่ในอุปสรรคเล็กน้อย ...
ให้ชั้นเรียนต่อไปนี้:
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
ฉันต้องการเขียนวิธีที่ดำเนินการกับวัตถุผลลัพธ์และส่งคืน โดยปกติจะใช้วิธีซิงโครนัส
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
แต่ฉันจะเปลี่ยนวิธีนี้เป็นวิธีอะซิงโครนัสโดยใช้ async / await ได้อย่างไร
นี่คือสิ่งที่ฉันได้ลอง:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody)
where T: Result, new()
{
// But I don't know what do do from here.
// What do I await?
}
Stream.ReadAsync()
ในเมธอดเมธอดนั้นควรเป็นแบบอะซิงโครนัสและส่งคืนTask<T>
ตำแหน่งT
ที่คุณส่งกลับมาคือเมธอดซิงโครนัส แนวคิดก็คือด้วยวิธีนี้ผู้เรียกใช้วิธีการของคุณทุกคนจะสามารถ "รอแบบอะซิงโครนัส" (ฉันไม่รู้ว่าคำนี้เป็นคำที่ดี) เพื่อให้การอ้างอิงStream.ReadAsync()
เสร็จสมบูรณ์ อุปมาสำหรับสิ่งนี้ที่คุณสามารถใช้ได้คือ async คือ "การติดเชื้อ" และแพร่กระจายจาก I / O ในตัวระดับต่ำไปยังโค้ดอื่น ๆ ซึ่งผลลัพธ์จะขึ้นอยู่กับ I / O ที่กล่าวไว้
new
ใช้งานอยู่T
เหตุใดวิธีการของคุณจึงต้องเป็นแบบอะซิงโครนัส AFAIK ในโค้ดโดยใช้ API แบบอะซิงโครนัสคุณจะต้องเผยแพร่async
ness จากวิธีการอื่นที่คุณใช้เท่านั้น