Прокомментировать код, использующий потоки - C#
Формулировка задачи:
Добрый день пытаюсь разобраться в работе с потоками. Появилось некоторое непонимание.
Написал некоторый простой код на WPF
Теперь не могу понять что в нем происходит. В функции DoSomething создается отдельный поток в котором начинает
работать цикл, а уже в самом цикле с помощью диспетчера вызывается обновления UI.
1. Почему тогда не работает DoSomethinBad, при запуске приложения оно просто намертво зависает пока не пройдет весь отсчет.
2. Какая разница между Dispatcher.BeginInvoke и Dispatcher.Invoke?
3. Использование Dispathera это плохая практика? В WPF лучше использоваться INotifyChanged?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Threading; namespace WpfApplication4 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } public void DoSomething(int TimeSleep,Label label,int Number) { Task.Factory.StartNew(() => { for (int i=0;i<100;i++) { Thread.Sleep(TimeSleep); Dispatcher.BeginInvoke(new Action(() => { label.Content = Number + " Runing" + i; })); } }); } public void DoSomethingBad(int TimeSleep,Label label,int Number) { Task.Factory.StartNew(() => { Dispatcher.BeginInvoke(new Action(() => { for (int i = 0; i < 100; i++) { Thread.Sleep(TimeSleep); label.Content = Number + " Runing" + i; } })); }); } private void Button_Click(object sender, RoutedEventArgs e) { DoSomething(1000, LabelFirst, 1); } private void Button_Click_1(object sender, RoutedEventArgs e) { DoSomething(500, LabelSecond, 2); } } }
4. Если же Dispatcher.BeginInvoke выполняется асинхронно, почему не работает обновление окна без создания дополнительно потока Task.Factory.StartNew?
Решение задачи: «Прокомментировать код, использующий потоки»
textual
Листинг программы
public void DoSomethingBad(int TimeSleep,Label label,int Number) { for (int i = 0; i < 100; i++) { Thread.Sleep(TimeSleep); label.Content = Number + " Runing" + i; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д