Прокомментировать код, использующий потоки - 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;
}
}