Sto scrivendo un'applicazione WinForms che trasferisce i dati su un dispositivo di classe HID USB. La mia applicazione utilizza l'eccellente libreria HID generica v6.0 che può essere trovata here. In poche parole, quando ho bisogno di scrivere i dati al dispositivo, questo è il codice che viene chiamato:Come attendere il completamento del metodo 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();
}
}
Quando il mio codice cade fuori dal giro, mentre, ho bisogno di leggere alcuni dati dal dispositivo. Tuttavia, il dispositivo non è in grado di rispondere subito, quindi devo aspettare che questa chiamata torni prima di continuare. Nella sua forma attuale, RequestToGetInputReport() viene dichiarata 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() si presenta così:
internal async Task<int> GetInputReportViaInterruptTransfer()
Purtroppo, io non sono molto familiare con il funzionamento delle nuove tecnologie async/await in .NET 4.5. Ho letto un po 'prima la parola chiave attendi e questo mi ha dato l'impressione che la chiamata a GetInputReportViaInterruptTransfer() all'interno di RequestToGetInputReport() attenda (e forse lo fa?) Ma non sembra la chiamata a RequestToGetInputReport() lo stesso è in attesa perché mi sembra di rientrare nel ciclo while quasi immediatamente?
Qualcuno può chiarire il comportamento che sto vedendo?
Grazie, Stephen. – user685869
Molto carino, grazie. Mi stavo grattando la testa su un problema simile e la differenza era di cambiare 'void' in' Task' proprio come avevi detto. – Jeremy
È una cosa secondaria, ma per seguire la convenzione entrambi i metodi dovrebbero avere Async aggiunto al loro nome, ad es. RequestToGetInputReportAsync() – mayu