powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Task. попытка доступа к элементу управления 'textBox1' не из того потока
9 сообщений из 9, страница 1 из 1
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39117332
Фотография flashslash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
есть форма, на ней кнопка и текстовое поле..

Пытаюсь заполнить текстовое поле, пример взял из MSDN, всего лишь заменив выпод в Console.WriteLine на вывод в textBox1


В SetTextCall вылетает ошибка

Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'textBox1' не из того потока, в котором он был создан.

прошу подсказать решение...

код:

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
namespace TestTask
{
    public partial class Form1 : Form
    {
        public delegate void SetTextBox(string s);
        public SetTextBox setText_delegate;
        
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Main1();
        }

        public void SetTextCall(string s)
        { 
            textBox1.Text=s;
        }

        public async void Main1()
           {
              var tasks = new List<Task>();
              Random rnd = new Random();
              Object lockObj = new Object();
              String[] words6 = { "reason", "editor", "rioter", "rental",
                                  "senior", "regain", "ordain", "rained" };

              foreach (var word6 in words6)
                 tasks.Add(Task.Factory.StartNew( (word) => { Char[] chars = word.ToString().ToCharArray();
                                                              double[] order = new double[chars.Length];
                                                              lock (lockObj) {
                                                                 for (int ctr = 0; ctr < order.Length; ctr++)
                                                                     order[ctr] = rnd.NextDouble();
                                                              }
                                                              Array.Sort(order, chars);
                                                              setText_delegate(word6);
                                                              //Console.WriteLine("{0} --> {1}", word,
                                                              //                  new String(chars));
                                                            }, word6));

              Task.WaitAll(tasks.ToArray());
           }

        private void Form1_Load(object sender, EventArgs e)
        {
            setText_delegate = new SetTextBox(SetTextCall);
        }

    }
}
...
Рейтинг: 0 / 0
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39117339
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нельзя из других потоков работать с UI, используй IProgress, либо ContinueWith с синхронизацией контекста
...
Рейтинг: 0 / 0
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39117347
Фотография flashslash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

для меня это очень ново... можно какой-нибудь пример?
...
Рейтинг: 0 / 0
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39117359
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flashslash,

Код: 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.
private void UpdateUI()
{

	var context = SynchronizationContext.Current;

	// Способ 1
	Task.Run(() =>
	{
		// Что-то делаем
		//...
		// Обновляем текстовое поле
		context.Send(obj => txt.Text = "OK!", null);
		// или
		this.Invoke(() => txt.Text = "OK!");
	});

	// Способ 2
	Task.Factory.StartNew(() =>
		{
			// Что-то делаем!
		}).ContinueWith(ant =>
		{
			txt.Text = "OK!";
		}, TaskScheduler.FromCurrentSynchronizationContext());

}
...
Рейтинг: 0 / 0
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39117369
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
if (Control.InvokeRequired)
   Control.Invoke(...);



по-моему, пора этот вопрос в фак какой-нибудь положить
...
Рейтинг: 0 / 0
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39117375
Фотография flashslash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoid,

большое спасибо!
работает 2-й способ, 1-й ругнулся на делегат..
использую второй...
а вообще мне все это нужно, чтобы запустить секундомер в Label отдельным потоком, а потом остановить его ..для того чтобы замерить SOAP-запросы к удаленному сервису..
надеюсь, 2-м способом это реализуемо
...
Рейтинг: 0 / 0
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39117532
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного не так написал (писал без студии). Вот так (в WPF попроще будет):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private void TestTask()
{

	Action<object> action = new Action<object>(obj => textBox1.Text = obj.ToString());

	Task.Factory.StartNew(() =>
	{
		for (int i = 0; i <= 100; ++i)
		{
			this.Invoke(action, i);
		}
	});

}



Это если что-то в цикле надо делать. А если нужно вывести результат, то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
private void TestTask()
{

	Task.Factory.StartNew(() =>
	{
		int i = 0;
		for (i = 0; i <= 100; ++i) ;
		return i;
	}).ContinueWith(ant => textBox1.Text = ant.Result.ToString(), TaskScheduler.FromCurrentSynchronizationContext());

}
...
Рейтинг: 0 / 0
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39117650
Фотография flashslash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoid,
Спасибо!
буду пробовать..
...
Рейтинг: 0 / 0
Task. попытка доступа к элементу управления 'textBox1' не из того потока
    #39120985
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Назовите мне хоть одну причину зачем из стороннего потока выполнять действия с UI ?

Уберите из функции оператор async, он у Вас не используется (WaitAll синхронизирует)

Выполняйте все вычисления в асинхронном потоке, а результат возвращайте в основной:
Код: 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.
        public IEnumerable<string> Main1()
        {
            var tasks = new List<Task<string>>();
            Random rnd = new Random();
            Object lockObj = new Object();
            String[] words6 = { "reason", "editor", "rioter", "rental",
                                  "senior", "regain", "ordain", "rained" };

            foreach (var word6 in words6)
                tasks.Add(Task<string>.Factory.StartNew((word) => {
                    Char[] chars = word.ToString().ToCharArray();
                    double[] order = new double[chars.Length];
                    lock (lockObj)
                    {
                        for (int ctr = 0; ctr < order.Length; ctr++)
                            order[ctr] = rnd.NextDouble();
                    }
                    Array.Sort(order, chars);
                    setText_delegate(word6);
                    return "asdf";
                    //Console.WriteLine("{0} --> {1}", word,
                    //                  new String(chars));
                }, word6));

            Task.WaitAll(tasks.ToArray());

            foreach (var res in tasks)
                yield return res.Result;
        }
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Task. попытка доступа к элементу управления 'textBox1' не из того потока
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]