Threads Tasks Task.Sleep

Threads Tasks Task.Sleep
chkam
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
  • Postów:59
0

Witam.

Przeglądając wiele stron na temat wątków w UWP, nie mogę się doszukać działających przykładów. Jedyne co mam to ten kod:

Kopiuj
        private void StartThread_Click(object sender,RoutedEventArgs e) {
            runThread();
        }

        // --------------------------------------------------------------------------------
        private async void runThread() { await Task.Run(() => thread()); }
        private void thread() {
            for (int i=0; i<=100000; i++) {
                Task.Delay(1000);
                resultThread( i );
            }
        }
        private async void resultThread( int i ) {
            if (Dispatcher.HasThreadAccess) {
                EditThread.Text = i.ToString();
            } else {
                //EditThread.Text = i.ToString();
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => resultThread( i ));
            }
        }

I chociaż wątek działa jeżeli usunę resultThread( i ); z void thread() to nie działa wgl. Task.Delay w nim zawarty.
Co mam zrobić by to działało?

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 18 godzin
2

Task.Delay() tworzy i uruchamia oddzielny wątek (Task), który kończy się sam po określonym czasie. Jeżeli chcesz na niego zaczekać, musisz wykonać na nim metodę Wait().

Przykładowo:

Kopiuj
private void thread()
{
    for (int i = 0; i <= 100000; i++)
    {
        Task.Delay(1000).Wait();
        //resultThread(i);
        Debug.WriteLine(i);
    }
}

Teraz widać w oknie Output, że tam kolejne liczby pojawiają się mniej więcej co sekundę.

screenshot-20170522134432.png

WeiXiao
Dzięki! A czy przypadkiem kiedyś nie trzeba było dodawać .Wait()? https://stackoverflow.com/a/22158489 Bo coś tego typu nie chce mi działać, a wydaje mi się, że kiedyś to szło :P
chkam
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
  • Postów:59
0

Plus jeszcze takie małe pytano, czy można stworzyć Task jako objekt? I jak w takiej definicji dodać mu funkcje którą ma wykonywać?

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 18 godzin
1

Oczywiście, że możesz.

Kopiuj
var t = new Task(() => jakaśFunkcja());
var t2 = new Task(() => { /* jakiś fragment kodu */ });
t.Start();
chkam
Ale niestety var już nie działa poza funkcją :/ jeżeli chciałbym zdefiniować Task globalnie
Ktos
To wpisz typ Task. Task to zwykła klasa :-)
chkam
Niestety wymaga funkcji static, także z tego nie odwołam się już do żadnego komponentu. Czyli będę musiał robić jak w oryginale.
E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:12 miesięcy
  • Postów:395
1
Ktos napisał(a):

Task.Delay() tworzy i uruchamia oddzielny wątek (Task), który kończy się sam po określonym czasie. Jeżeli chcesz na niego zaczekać, musisz wykonać na nim metodę Wait().

Przykładowo:

Kopiuj
private void thread()
{
    for (int i = 0; i <= 100000; i++)
    {
        Task.Delay(1000).Wait();
        //resultThread(i);
        Debug.WriteLine(i);
    }
}

@Ktos Task.Delay nie tworzy nowego wątku, a .Wait() blokuje wątek który wykonuje tą metodę.

Lepszą praktyką jest zrobić await Task.Delay(1000);

edytowany 1x, ostatnio: error91
Ktos
Tak, masz rację.
JU
Zawsze można też użyć starych, dobrych wątków (w sensie Thread). Zależy od potrzeby
Ktos
Task i Thread to trochę dwie różne rzeczy, ale wątek dotyczy UWP, więc tutaj akurat musimy użyć Task, bo Thread nie jest obsługiwany (możliwe, że będzie w UWP vNext).
E9
w sensie jak nie jest obsługiwany? nie można stworzyć new Thread() ? To w takim razie co się stanie jak zrobimy Task z opcją LongRunning, która tworzy zawsze nowy wątek? (pytam bo nigdy nie używałem UWP)
Ktos
Nie ma takiej klasy jak System.Threading.Thread w UWP. Jak się stworzy Task z LongRunning to tam pod spodem tworzy się nowy wątek AFAIK, ale nie jest to w żaden sposób udokumentowane ani w 100% pewne (aczkolwiek działa, obecnie). Dwuletnia dyskusja na ten temat: https://github.com/dotnet/corefx/issues/2576

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.