Skip to content

Jak komunikovat asynchronně

papouch.com edited this page Sep 12, 2018 · 1 revision

Co je synchronní komunikace?

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.

Co je asynchronní komunikace?

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ě.

Asynchronní komunikace v samostatném vlákně (await Task)

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.

  1. Po stisku tlačítka Measure je v samostatném vlákně zavolána funkce MeasureAsync. (Všimněte si, že obsluha stisku tlačítka má v definici důležitý parametr async.)
  2. 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á funkce MeasureAsync.
  3. Po dokončení funkce MeasureAsync se hlavní vlákno vrátí do Measure_Click a pokračuje dále. To znamená, že do textového pole Temperature 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";
}