Tôi đang viết một ứng dụng WinForms để truyền dữ liệu sang thiết bị lớp USB HID. Ứng dụng của tôi sử dụng thư viện Generic HID tuyệt vời v6.0 có thể tìm thấy ở đây . Tóm lại, khi tôi cần ghi dữ liệu vào thiết bị, đây là mã được gọi:
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();
}
}
Khi mã của tôi thoát khỏi vòng lặp while, tôi cần đọc một số dữ liệu từ thiết bị. Tuy nhiên, thiết bị không thể phản hồi ngay lập tức nên tôi cần đợi cuộc gọi này trở lại trước khi tiếp tục. Vì nó hiện đang tồn tại, RequestToGetInputReport () được khai báo như sau:
private async void RequestToGetInputReport()
{
// lots of code prior to this
int bytesRead = await GetInputReportViaInterruptTransfer();
}
Đối với giá trị của nó, khai báo cho GetInputReportViaInterruptTransfer () trông như thế này:
internal async Task<int> GetInputReportViaInterruptTransfer()
Thật không may, tôi không quen lắm với hoạt động của các công nghệ async / await mới trong .NET 4.5. Tôi đã đọc một chút trước đó về từ khóa đang chờ và điều đó mang lại cho tôi cảm giác rằng cuộc gọi đến GetInputReportViaInterruptTransfer () bên trong RequestToGetInputReport () sẽ chờ (và có thể nó giống như vậy?) Nhưng dường như đó không phải là cuộc gọi đến RequestToGetInputReport () Bản thân nó đang chờ đợi vì dường như tôi đang quay lại vòng lặp while gần như ngay lập tức?
Bất cứ ai có thể làm rõ hành vi mà tôi đang nhìn thấy?
void
đểTask
giống như bạn đã nói.