Я пишу приложение WinForms, которое передает данные на USB-устройство класса HID. В моем приложении используется отличная универсальная HID-библиотека v6.0, которая может быть найдена here. В двух словах, когда мне нужно записать данные на устройство, это код, который вызывается:Как дождаться завершения процедуры async?
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() сам ждет, потому что я, кажется, сразу возвращаюсь в цикл while почти сразу?
Может ли кто-нибудь уточнить поведение, которое я вижу?
Спасибо, Стивен. – user685869
Очень приятно, спасибо. Я почесывал голову по аналогичной проблеме, и разница заключалась в том, чтобы изменить 'void' на' Task' так же, как вы сказали. – Jeremy
Это второстепенная вещь, но для соблюдения соглашения оба метода должны иметь Async, добавленный к их именам, например. RequestToGetInputReportAsync() – mayu