Tôi đang viết một ứng dụng WinForms chuyển dữ liệu đến 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ể được tìm thấy here. Tóm lại, khi tôi cần phải ghi dữ liệu vào thiết bị, đây là đoạn code đó được gọi là:Làm cách nào để đợi phương thức không đồng bộ hoàn thành?
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 rơi ra khỏi vòng lặp thời gian, tôi cần phải đọ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 vì vậy 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ư thế này:
private async void RequestToGetInputReport()
{
// lots of code prior to this
int bytesRead = await GetInputReportViaInterruptTransfer();
}
Đối với những gì nó có giá trị, tờ khai cho GetInputReportViaInterruptTransfer() trông như thế này:
internal async Task<int> GetInputReportViaInterruptTransfer()
Thật không may, tôi không phải là rất quen thuộc với các 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 chờ đợi và điều đó đã cho tôi ấn tượng rằng lời gọi đến GetInputReportViaInterruptTransfer() bên trong RequestToGetInputReport() sẽ đợi (và có thể nó?) Nhưng nó không giống như lời gọi đến RequestToGetInputReport() chính nó đang chờ đợi bởi vì tôi dường như đang bước vào vòng lặp while gần như ngay lập tức?
Có ai có thể làm rõ hành vi mà tôi thấy không?
Cảm ơn bạn, Stephen. – user685869
Rất đẹp, cảm ơn bạn. Tôi đã gãi đầu về một vấn đề tương tự và sự khác biệt là thay đổi 'void' thành' Task' giống như bạn đã nói. – Jeremy
Đó là một điều nhỏ nhặt, nhưng phải tuân theo quy ước cả hai phương pháp nên có Async được thêm vào tên của chúng, ví dụ: RequestToGetInputReportAsync() – mayu