Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
.NET 4.x

Как (когда) нужно использовать ExecutionContext.Run()?

18.11.2019, 14:03. Показов 4532. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!

Экспериментирую с ExecutionContext.
Есть WPF приложение с кнопкой и текстовым полем. По нажатию кнопки запускаю поток из пула потоков, в котором хочу вставить текст в текстовое поле. Знаю, что сделать это можно только в UI потоке. Есть у нас такая штука, как ExecutionContext.Run, в описании которой сказано:
Runs a method in a specified execution context on the current thread.
И казалось бы, ну вот возьму сейчас с ее помощью и сделаю что надо.
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void Button_Click(object sender, RoutedEventArgs e)
{
    DoWork3();
}
 
public void DoWork3()
{
    var ec = ExecutionContext.Capture();
    ThreadPool.QueueUserWorkItem(delegate
    {
        Thread.Sleep(1000);
        ExecutionContext.Run(ec, delegate
        {
            tbMessage.Text = "Completed!";
        }, null);
    });
}
На строке tbMessage.Text = "Completed!"; вылетает исключение, которое говорит о том, что доступ к элементу может осуществляться только из потока, который его создал. Но как же
Runs a method in a specified execution context on the current thread.
?

Вопрос: это можно сделать именно через ExecutionContext.Run? Или это вообще для каких-то других целей.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2019, 14:03
Ответы с готовыми решениями:

В чем разница между StringWriter и StringBuilder и когда нужно использовать эти классы?
Подскажите, пожалуйста, в чем разница между StringWriter и StringBuilder и когда нужно использовать эти классы? То, что есть в этих...

Когда нужно использовать структуры, когда классы, а когда словарь?
Хеллоу. Не могу понять, когда, что, нужно использовать. Допустим мне нужно получить объект, который имеет список объектов. И...

Когда нужно использовать ссылку с out, а когда с ref
Не давно начал учить С# но не могу понять когда надо использовать оut или ref , я так понимаю что это ссылки как в С++. Единственно в чем...

4
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
19.11.2019, 01:15
Цитата Сообщение от V0fka Посмотреть сообщение
Как (когда) нужно использовать ExecutionContext.Run()?
Примерно никогда.

Цитата Сообщение от V0fka Посмотреть сообщение
Runs a method in a specified execution context on the current thread.
On the current thread.

Цитата Сообщение от V0fka Посмотреть сообщение
вылетает исключение, которое говорит о том, что доступ к элементу может осуществляться только из потока, который его создал.
все правильно.

Цитата Сообщение от V0fka Посмотреть сообщение
Но как же
Runs a method in a specified execution context on the current thread.
Current thread это поток в котором выполняется код. В вашем примере код выполняется в потоке из thread pool.

Цитата Сообщение от V0fka Посмотреть сообщение
Или это вообще для каких-то других целей.
Для других целей.

Ограничение на выполнение кода из разных потоков уходит корнями в WinAPI на которых основаны все виндовс приложения. Отчасти это было сделано чтобы упростить разработку api, отчасти потому что делать многопоточный UI нецелесообразно из-за необходимости постоянной синхронизации доступа к данным для обеспечения консистентного состояния.

Добавлено через 5 минут
P.S. То что вы пытаетесь сделать можно сделать используя SynchronizationContext, но выполняться код все равно будет в UI потоке, в порядке очереди обработки сообщений в windows message loop.
1
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
19.11.2019, 10:03  [ТС]
nicolas2008, спасибо за ответ!

Цитата Сообщение от nicolas2008 Посмотреть сообщение
Для других целей.
Я был бы очень признателен, если бы вы, хотя бы вкратце, рассказали для каких.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
20.11.2019, 22:31
Лучший ответ Сообщение было отмечено V0fka как решение

Решение

Цитата Сообщение от V0fka Посмотреть сообщение
Я был бы очень признателен, если бы вы, хотя бы вкратце, рассказали для каких
Вкратце, ExecutionContext это контейнер содержащий разную информацию. Там например содержится информация о текущей локали которая установлена для потока, а также параметры безопасности влияющие на ограничения выполнения кода.

Самый простой пример:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Threading;
 
namespace ConsoleAppEFCore
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "main thread";
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");
            
            PrintThreadLocaleInfo();
 
            var ctx = ExecutionContext.Capture();
 
            var thread1 = new Thread(() => 
            {
                PrintThreadLocaleInfo();
 
                ExecutionContext.Run(ctx, (c) =>
                {
                    PrintThreadLocaleInfo();
                }, null);
            });
 
            thread1.Name = "background thread";
            thread1.CurrentCulture = new System.Globalization.CultureInfo("ru-ru");
 
            thread1.Start();
            thread1.Join();
 
            Console.WriteLine("Press any key for exit");
            Console.ReadKey();
        }
 
        private static void PrintThreadLocaleInfo()
        {
            Console.WriteLine($"Execution on '{Thread.CurrentThread.Name}'. Locale is '{Thread.CurrentThread.CurrentCulture.Name}'");
        }
    }
}
Результат выполнения
Code
1
2
3
4
Execution on 'main thread'. Locale is 'en-US'
Execution on 'background thread'. Locale is 'ru-RU'
Execution on 'background thread'. Locale is 'en-US'
Press any key for exit
Я как бы и не углублялся в изучение этого потому как
ExecutionContext is one of those things that the vast majority of developers never need to think about.
Но информацию по тему при желании найти можно.
Например тут или здесь
1
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
22.11.2019, 11:31  [ТС]
nicolas2008, спасибо за ответ!

Цитата Сообщение от nicolas2008 Посмотреть сообщение
Вкратце, ExecutionContext это контейнер содержащий разную информацию. Там например содержится информация о текущей локали которая установлена для потока, а также параметры безопасности влияющие на ограничения выполнения кода.
Вот. Среди того, что вы перечислили, в нем же находится и SynchronizationContext. Поэтому я думал, что раз ExecutionContext содержит SynchronizationContext, то можно через ExecutionContext выполнить код в другом потоке, как это делается через SynchronizationContext.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.11.2019, 11:31
Помогаю со студенческими работами здесь

Когда следует использовать значимый тип, а когда ссылочный?
Почитал про значимые и ссылочные типы, ознакомился с отличиями между ними, как работают те и другие. Но хотел бы увидеть от...

Когда использовать ссылочные типы, а когда использовать типы значений?
Как это определить?

Когда использовать IEquatable<T>, а когда IStructuralEquatable?
Когда использовать IEquatable&lt;T&gt;, а когда IStructuralEquatable?

Использовать значение из Task.Run
Привет всем! Подскажите как правильно выстроить логику: у меня есть ф-ия ReadBarcode(), которая вызывает ReadTwoScanners() и...

Передать функцию как параметр, и выполнить ее когда это нужно
Как я могу передать результат выполнения метода как параметр в другой метод, но чтобы сам результат обрабатывался когда это понадобиться? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru