Dies ist etwas, für das ich immer Threads/BackgroundWorker verwendet habe, aber ich versuche, zu Task-Weg zu migrieren.Kontinuierliches Polling mit Tasks
Angenommen, ich verwende ein SDK von einem Drittanbieter, das ich zum Lesen von Bytes von einem USB-Anschluss verwende. Dieser Leseaufruf blockiert und endet nach 100 ms, wenn keine Bytes gelesen werden und gibt null zurück. Es kehrt sofort zurück, wenn Bytes gelesen werden, wobei Byte [] Array von gelesenen Bytes zurückgegeben wird.
Also muss ich im Grunde polling wieder und wieder, und Maßnahmen für empfangene Bytes, indem Sie Parsing-Funktion aufrufen. Es ist eine WPF-Anwendung, daher sollten die zurückgegebenen Bytes an eine UI-Thread-Funktion übergeben werden können.
Was ist der richtige Ansatz dafür? Das ist, was ich habe so weit, und es scheint zu funktionieren, aber ich möchte sicherstellen, dass es der richtige Weg, Dinge zu tun TPL mit:
private void _connectUsbButton_Click(object sender, RoutedEventArgs e)
{
ListenForUsbMessagesAsync();
}
private async void ListenForUsbMessagesAsync()
{
while (true)
{
byte[] readBytes = await ReadBytesAsync();
Parse(readBytes);
}
}
private Task<byte[]> ReadBytesAsync()
{
Task<byte[]> readBytesTask = Task.Run(() =>
{
byte[] bytes;
do
{
bytes = ReadBytes();
} while (bytes == null);
return bytes;
});
return readBytesTask;
}
private byte[] ReadBytes()
{
byte[] readBytes = _usbSdk.ReadBytes(); //100ms timeout (returns null if no bytes read)
return readBytes;
}
'Aufgabe' für einen eventuellen Ergebnis ist, nicht eine, die regelmäßig geschieht. –
@ DanielA.White das ist, warum ich es in der while (true) Schleife anrufe. Das letztendliche Ergebnis ist, dass einige Bytes gelesen werden. Die Bytes werden nicht die ganze Zeit gelesen, tatsächlich werden meistens keine Bytes gelesen. – Eternal21
Warum hast du 'Thread' für diese Art von Aufgabe nicht gemocht? 'Aufgaben sind so konzipiert, dass sie schnell abgeschlossen werden, während Ihr IO Minuten dauern kann. – slawekwin