prosty przykład async await

0

Witam Wszystkich.

Bardzo mi przykro, że zawracam gitarę i nie wiem jak to zrobić...

Zadanie jest proste: Mamy kulkę na ekranie. Jej ruch przy użyciu jakiegoś prostego mechanizmu dispatchertimer jak działa sam proces ruchu to działa to płynnie -
nie wiem czy tu ma znaczenie podawanie kodu ponieważ to prosta czynność zmiany położenia obiektu na formie wpf. Canvas.Left="{Binding posX}" Canvas.Top="{Binding posY}".

ale jak działają inne procesy to ruch przy użyciu rozwiązania z dispatchertimer jest ruchem krokowym (skaczącym), co jakiś odstęp czasu.

W NET4.0 robiło się takie zadanie prosto - Tworzyło się BackgroundWorker i po zawodach.

A w NET4.5 są async i await - i wierzcie mi nie czuje tematu. Czy ktoś może mi to wytłumaczyć na przykładzie np ruchu kulki z pozycji 100,100 do pozycji 200,100 (przesunięcie płynne 101pixeli) ?

pozdrawiam serdecznie,

0

nie bardzo kumam co chcesz uzyskać
zarówno BackgroundWorker jak i async await się średnio nadają do animacji. Animację zazwyczaj chce się w określonej ilości fpsów więc najbardziej się nadaje timer z interwałem ustawionym na 1000/fps ms.
A w wpf to już w ogóle ruch kulki najlepiej zrobić na storyboard i opisać w całości za pomocą xamla

1

na siłę wyglądałoby to jednak tak:

        private async void Ellipse_MouseDown(object sender, MouseButtonEventArgs e)
        {
            for (var i = 100; i < 200; i ++)
            {
                await Task.Delay(25);
                Canvas.SetLeft(kulka, i);
            }
        }

ale await Task.Delay nie powinno się znaleźć w produkcyjnym kodzie tak samo jak Thread.Sleep

0

Dziękuję za odpowiedź.

W przypadku ruchu kulki chodzi mi o bardzo drobną animację pewnego procesu i właśnie przez ominięcie pewnego rozbudowywania tematu samej animacji potrzebny był mi przykład animacji jak wskazałeś w drugiej wiadomości. Same użycie Thread.Sleep czy task.delay nie uważam niczym złym jeżeli mowa o potrzebie opóźnienia wykonania jakiegoś zadania. Niemniej uważam że to jest dobrze stosować tam gdzie to jest niezbędne

W między czasie zrobiłem właśnie Task rys = new Task() i podobnie jak u Ciebie w pętli i to działa płynnie przy działaniu pozostałych "etapów" działania aplikacji.

W sumie osiągneliśmy ten sam efekt - dziękuję i pozdrawiam.

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