Async i Await i aplikacja WPF

0

Witam,

Proszę szanownego grona - nie wiem jak to zrobić, więc proszę o jakąś podpowiedź.
Programując dowolne procesy pracujące w tle to miałem BackgroundWorker z metodą RunWorkerCompleted. Wszystko się odpalało po wystąpieniu jakiegoś zdarzenia przez RunWorkerAsync() i było git.

W NET 4.5 już nie ma BackGroundWorker a tylko async i await i niby rozumiem, jak to działa. Nie wiem jak
tylko jak zrobić takie coś:

odpalona jest aplikacja z formą WPF (UI) która w czasie rzeczywistym sprawdza stan portu czy pojawia się jakaś wartość (com1 (RS232)), wyzwolenie wątku powodowane jest przez await ale w moim rozumieniu działa to do chwili zakończenia wątku potem sam z siebie do tego nie wróci. A mi chodzi o coś takiego co w programowaniu synchronicznym można było zrobić przez użycie jakiegoś timer-a. W WPF timerów nie ma i nie wiem jak to ruszyć. Jest Dispatcher ( ale nie wiem czy to jest rozsądne korzystanie z czegoś takiego ?

Proszę o jakieś podpowiedzi, pomoc. Z góry dziękuję.

pozdrawiam

0

Witam,

Nie wiem jak u ciebie ale u mnie to ciągle jest, MSDN jest podobnego zdania https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx. Z tego co pamiętam do odbieranie danych z portu szeregowego zawsze odbywało się w osobnym wątku więc wystarczy obsłużyć przekazywanie danych do procesu działającego w innym wątku. Lepiej pokaż fragment programu z którym masz problem.

Pozdrawiam,

mr-owl

0

Jeszcze nie jest gotowy. Nie czując tematu jak uruchamiać sekwencyjnie wątek powodujący uruchomienie zadania to zatrzymałem się. Sama obsługa portu com przez system.io nie sprawia mi problemu. W programowaniu synchronicznym uruchamiam to co jakiś odstęp czasu i działa. Jedyny mankament że to powoduje zablokowanie głównego wątku dlatego stopniowo próbuje przebrnąć przez programowanie asynchroniczne... Ponadto pytam o async i await i zasadność albo czy rozsądne jest używanie dispatcher. Niestety nie znam j. angielskiego w tak dużym stopniu żebym się wsparł całą gamą materiałów z netu, MSDN itp. Stąd moje pytanie jest tu. Na forum.
pozdrawiam

0

Witam,

Ale odbiór danych z portu szeregowego odbywa się w osobnym wątku więc nie wiem jak może blokować Ci się UI. Bardzo pomaga w tym klasa DispatchingObservableCollection którą znajdziesz pod adresem https://michlg.wordpress.com/2009/08/14/dispatchingobservablecollection-thread-save-observablecollection/

Pozdrawiam,

mr-owl

0

hm - nie zrozumieliśmy się - nic mi się nie blokuje. Pisałem że przy aplikacji w trybie synchronicznym to uruchomienia nasłuchu portu powoduje przywieszenie się aplikacji.
A mi chodzi o osiągnięcie innego efektu. otwarte okno aplikacji. Można na tym oknie robić dowolne działania. Wcisnąć button,
wprowadzić dowolną daną, a jednocześnie w tle jest wykonywane nasłuchiwanie portu. jak Wartość zostanie otrzymana - program przerywa działanie formy i wykonuje czynność. Potem wraca do poprzedniego stanu (działania na formularzu, a tle aplikacji działą dalej wątek sprawdzający stan portu do czasu wystąpenia jakiegiejś wartości. Odczytane parametry przekazuje do innego zadania a sam dalej nasłuchuje.

pozdrawiam

0

Witam,

To ja nie rozumiem, po co działać na porcie szeregowym w sposób synchroniczny, to musi blokować program. Normalnie podpinasz się pod event SerialPort.DataReceived https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx i gdy pojawią się dane wątek je przetwarza i przesyła je dalej.

Pozdrawiam,

mr-owl

0

Kurcze, ja swoje a Ty swoje. Mi chodzi o uruchamianie wątku który się uruchamia się sekwencyjnie co jakiś czas a Ty mi mówisz o nasłuchiwaniu portu. Powtórzę raz jeszcze z portem sobie poradzę i mi to działa. Chcę by w tle UI działał "odpalacz" wysyłający zapytanie do portu com i czekał na odpowiedź (urządzenie na com samo z siebie nie wyśle sygnału dopóki nie zostanie otrzymane przez urządzenie - zapytanie). A nie będę uruchamiał wykonanie akcji wciskając klawisz lub cokolwiek innego. Potrzebny mi jest sposób a'la "Timer". Prośba - daj spokój procesowi związanemu z COM-em. Na porcie nie ma czegokolwiek co powoduje wysłanie samoistnie sygnał do PC generując zdarzenie na porcie i tym samym uruchomienie jakiego zadania w apce.

pozdrawiam

1

Witam,

obiekt timer-a

private readonly DispatcherTimer dispatcherTimer = new DispatcherTimer();

w konstuktorze formy

this.dispatcherTimer.Interval = TimeSpan.FromMilliseconds(1000);
this.dispatcherTimer.Tick += this.DispatcherTimerTick;
this.dispatcherTimer.Start();

moj event, tutaj mozesz pisac do portu

private void DispatcherTimerTick(object sender, EventArgs args)
{
    var currentProcess = Process.GetCurrentProcess();
    var memoryUsed = currentProcess.PrivateMemorySize64;
    this.MemoryStatus = string.Format(CultureInfo.InvariantCulture, @"{0} MB", memoryUsed / 1024 / 1024);
}

A odbiór danych z event-u

Może być tak dla WPF

Pozdrawiam,

mr-owl

0

hm. ładnie to wygląda - bardzo dziękuję. Za godzinkę usiądę do kompa to potestuje to rozwiązanie - myślę, że o coś takiego mi właśnie chodziło. Jeszcze raz dziękuję za podpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1