Мне интересно, что случится с областями, если у меня внутри конструктора UserControl будет следующий код:
private static DispatcherTimer _exampleTimer = new DispatcherTimer(DispatcherPriority.Background);
private static DispatcherTimer _exampleTimer2 = new DispatcherTimer(DispatcherPriority.Background);
public UserControlSomeName()
{
try
{
InitializeComponent();
// Task1
Task.Factory.StartNew(() =>
{
// more code
Dispatcher.Invoke(() =>
{
// more code
// Task2
Task.Factory.StartNew(() => { SomeMethod(); });
// more code
_exampleTimer.Tick += (s, e) => { SomeMethod(); };
}
}
}
// more code
_exampleTimer2.Tick += (s, e) => { SomeMethod(); };
}
- Конструктор UserControl работает в визуальном потоке.
- Task1 находится в другом потоке (не визуально).
- Когда Dispatcher.Invoke () выполняется, он "запрашивает" визуальный поток выполнить код внутри него.
- Task2 , хотя находится внутри Invoke , он находится в новой Task , поэтому он запускается в новом потоке вне визуального потока.
Но метод обработчика _exampleTimer будет выполняться внутри визуального потока, поскольку обработчик объявлен внутри Invoke.
Я уже провел некоторый тест на выполнение кода, но я не уверен, прав ли я, может кто-нибудь помочь мне понять, правильно ли это?
Если бы SomeMethod был вместо этого встроенным методом для обрабатывать таймер, поведение будет таким же?
Если тот, кто находится внутри Только UserControl, например _exampleTimer2 , который будет выполняться внутри визуального потока или в другом потоке?
(Пожалуйста, это пример, это не настоящий код).