ฉันกำลังเขียนแอปพลิเคชัน WinForms ที่ถ่ายโอนข้อมูลไปยังอุปกรณ์ USB HID class ใบสมัครของฉันใช้ที่ดีเยี่ยม v6.0 ห้องสมุดทั่วไป HID ซึ่งสามารถพบได้ที่นี่ โดยสรุปเมื่อฉันต้องการเขียนข้อมูลไปยังอุปกรณ์นี่คือรหัสที่ถูกเรียก:
private async void RequestToSendOutputReport(List<byte[]> byteArrays)
{
foreach (byte[] b in byteArrays)
{
while (condition)
{
// we'll typically execute this code many times until the condition is no longer met
Task t = SendOutputReportViaInterruptTransfer();
await t;
}
// read some data from device; we need to wait for this to return
RequestToGetInputReport();
}
}
เมื่อรหัสของฉันหลุดจากลูปขณะที่ฉันต้องอ่านข้อมูลบางอย่างจากอุปกรณ์ อย่างไรก็ตามอุปกรณ์ไม่สามารถตอบสนองได้ทันทีดังนั้นฉันต้องรอให้การโทรนี้กลับมาก่อนที่ฉันจะดำเนินการต่อ ตามที่มีอยู่ในปัจจุบัน RequestToGetInputReport () จะประกาศดังนี้:
private async void RequestToGetInputReport()
{
// lots of code prior to this
int bytesRead = await GetInputReportViaInterruptTransfer();
}
สำหรับสิ่งที่มีค่าการประกาศสำหรับ GetInputReportViaInterruptTransfer () มีลักษณะดังนี้:
internal async Task<int> GetInputReportViaInterruptTransfer()
น่าเสียดายที่ฉันไม่คุ้นเคยกับการทำงานของเทคโนโลยี async / await ใหม่ใน. NET 4.5 ก่อนหน้านี้ฉันได้อ่านเล็กน้อยเกี่ยวกับคำหลักที่รอคอยและนั่นทำให้ฉันรู้สึกว่าการเรียกไปยัง GetInputReportViaInterruptTransfer () ภายใน RequestToGetInputReport () จะรอ (และอาจจะใช่หรือไม่) แต่ดูเหมือนจะไม่เป็นการเรียกร้องให้ RequestToGetInputReport () ตัวเองกำลังรอเพราะฉันดูเหมือนจะกลับเข้าห่วงในขณะที่เกือบจะในทันที?
ทุกคนสามารถอธิบายพฤติกรรมที่ฉันเห็นได้หรือไม่
void
ไปTask
เช่นเดียวกับท่านได้กล่าวว่า