Piszę aplikację WinForms, która przesyła dane do urządzenia USB klasy HID. Moja aplikacja korzysta z doskonałej biblioteki Generic HID v6.0, którą można znaleźć tutaj . W skrócie, kiedy muszę zapisać dane do urządzenia, jest to kod, który jest wywoływany:
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 wypadnie z pętli while, muszę odczytać niektóre dane z urządzenia. Jednak urządzenie nie może od razu odpowiedzieć, więc muszę poczekać, aż to połączenie powróci, zanim będę kontynuować. W obecnej formie RequestToGetInputReport () jest zadeklarowana w następujący sposób:
private async void RequestToGetInputReport()
{
// lots of code prior to this
int bytesRead = await GetInputReportViaInterruptTransfer();
}
Na co warto zwrócić uwagę, deklaracja GetInputReportViaInterruptTransfer () wygląda następująco:
internal async Task<int> GetInputReportViaInterruptTransfer()
Niestety nie jestem zbyt zaznajomiony z działaniem nowych technologii async / await w .NET 4.5. Poczytałem trochę wcześniej o słowie kluczowym await i to dało mi wrażenie, że wywołanie GetInputReportViaInterruptTransfer () wewnątrz RequestToGetInputReport () będzie czekać (a może tak jest?), Ale nie wygląda na to, że wywołanie RequestToGetInputReport () samo czeka, ponieważ prawie natychmiast ponownie wchodzę w pętlę while?
Czy ktoś może wyjaśnić zachowanie, które widzę?
void
sięTask
tak, jak powiedziałeś.