Sto scrivendo un'applicazione WinForms che trasferisce i dati su un dispositivo di classe USB HID. La mia applicazione utilizza l'eccellente libreria Generic HID v6.0 che può essere trovata qui . In breve, quando devo scrivere i dati sul dispositivo, questo è il codice che viene chiamato:
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();
}
}
Quando il mio codice esce dal ciclo while, devo leggere alcuni dati dal dispositivo. Tuttavia, il dispositivo non è in grado di rispondere immediatamente, quindi devo attendere che questa chiamata torni prima di continuare. Come attualmente esiste, RequestToGetInputReport () è dichiarato in questo modo:
private async void RequestToGetInputReport()
{
// lots of code prior to this
int bytesRead = await GetInputReportViaInterruptTransfer();
}
Per quello che vale, la dichiarazione per GetInputReportViaInterruptTransfer () è simile al seguente:
internal async Task<int> GetInputReportViaInterruptTransfer()
Sfortunatamente, non ho molta familiarità con il funzionamento delle nuove tecnologie asincrone / wait in .NET 4.5. Ho letto un po 'prima la parola chiave wait e mi ha dato l'impressione che la chiamata a GetInputReportViaInterruptTransfer () all'interno di RequestToGetInputReport () avrebbe atteso (e forse lo fa?) Ma non sembra la chiamata a RequestToGetInputReport () stesso sta aspettando perché mi sembra di rientrare nel ciclo while quasi immediatamente?
Qualcuno può chiarire il comportamento che sto vedendo?
void
aTask
proprio come avevi detto.