Threads Tasks Task.Sleep

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:

        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?

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:

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

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ć?

1

Oczywiście, że możesz.

var t = new Task(() => jakaśFunkcja());
var t2 = new Task(() => { /* jakiś fragment kodu */ });
t.Start();
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:

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);

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