-
Notifications
You must be signed in to change notification settings - Fork 2
Jak komunikovat asynchronně
Synchronní komunikace znamená, že program pošle příkaz do zařízení a pak čeká dokud zařízení neodpoví. Při pomalé komunikaci po sériové lince to může způsobovat potíže - například chvilkové "zamrznutí" hlavního vlákna programu, pokud zařízení trvá odpověď dlouho.
Asynchronní komunikace znamená, že program pošle příkaz do zařízení a plynule dále pokračuje ve vykonávání ostatních činností. Odeslání příkazu i zpracování odpovědi je vykonáváno v samostatném vlákně, takže nemůže dojít k "zamrznutí" okna programu.
Knihovna Spinel.net je převážně synchronní, i když například automatické zprávy o změnách stavů umí zpracovávat asynchronně.
Zde uvádíme jednoduchý příklad jak příkazy do zařízení odesílat nezávisle na hlavním vlákně programu. Příklad je demonstrován na měření teploty teploměrem TQS, který má sériové rozhraní RS485.
- Po stisku tlačítka
Measure
je v samostatném vlákně zavolána funkceMeasureAsync
. (Všimněte si, že obsluha stisku tlačítka má v definici důležitý parametrasync
.) - Hlavní vlákno programu přeruší zpracování
Measure_Click
a pokračuje dále jinými činnostmi, které má na práci bez ohledu na to jak dlouho trvá funkceMeasureAsync
. - Po dokončení funkce
MeasureAsync
se hlavní vlákno vrátí doMeasure_Click
a pokračuje dále. To znamená, že do textového poleTemperature
vypíše zjištěnou teplotu a poté do konzole vypíše text Ok.
(Pozor, že v programu musíte zajistit, že nebudete posílat další příkaz, dokud nedorazí odpověď na předchozí.)
private async void Measure_Click(object sender, RoutedEventArgs e)
{
Temperature.Text = await Task.Run(() => MeasureAsync());
Console.WriteLine("Ok");
}
private string MeasureAsync()
{
if (MyDevice.CmdGetTemperature(out float temp) == ResponseACK.AllIsOk)
return $"{temp:0.0} °C";
else
return "error";
}