Piszę aplikację WinForms, która przesyła dane do urządzenia klasy USB HID. Moja aplikacja używa doskonałej biblioteki Generic HID w wersji 6.0, którą można znaleźć pod adresem here. W skrócie, gdy trzeba zapisać dane do urządzenia, jest to kod, który pobiera nazywane:Jak czekać na zakończenie metody asynchronicznej?
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();
}
}
Kiedy mój kod spada z pętli while, muszę przeczytać kilka danych z urządzenia. Jednak urządzenie nie jest w stanie odpowiedzieć od razu, więc muszę czekać na to wezwanie, aby powrócić, zanim przejdę dalej. Jako że obecnie istnieje, RequestToGetInputReport() jest zadeklarowana następująco:
private async void RequestToGetInputReport()
{
// lots of code prior to this
int bytesRead = await GetInputReportViaInterruptTransfer();
}
Na co warto, zgłoszenie o GetInputReportViaInterruptTransfer() wygląda następująco:
internal async Task<int> GetInputReportViaInterruptTransfer()
Niestety, nie jestem bardzo obeznany z funkcjonowaniem nowych technologii asynchronicznych/oczekujących w .NET 4.5. Czytałem wcześniej trochę o oczekiwanym słowie kluczowym i to dało mi wrażenie, że wywołanie GetInputReportViaInterruptTransfer() wewnątrz RequestToGetInputReport() czekałoby (i może to robi?), Ale to nie wydaje się być wezwaniem do RequestToGetInputReport() sam czeka, ponieważ wydaje mi się, że niemal natychmiast powracam do pętli while?
Czy ktoś może wyjaśnić zachowanie, które widzę?
Dziękuję, Stephen. – user685869
Bardzo ładne, dziękuję. Podrapałam się w podobny problem, a różnica polegała na tym, że zmieniłaś 'void' na' Task', tak jak powiedziałeś. – Jeremy
To drobnostka, ale zgodnie z konwencją obie metody powinny mieć asynchroniczne nazwy, np. RequestToGetInputReportAsync() – mayu