В WinForms, почему Вы не можете обновить средства управления UI от других потоков?

Первая ваша ошибка начинается с символа меньше, чем < С этого момента Excel не знает, что делать, поскольку он больше не текст

[110 ]

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

="INSERT INTO taSwitchFilter VALUES('"&A2&"','111','1','"&B3&"','<properties actionContext=""After""><rule type=""SwitchRequestType""><switchRequestType type=""List Event PGM"" /></rule><rule type=""Source""><source type=""Logical""><logical name=" &B3& " /></source></rule></properties>','69')"

Обратите внимание, что если вы хотите включить символ кавычки в вывод , вам на самом деле нужно поставить два символа кавычки или использовать & amp; СИМ (34) & амп; для цитаты персонажа.

Хитрость с этой длинной формулой заключается в том, чтобы разбить формулу медленно, а не пытаться сделать это за один раз. Удачи и надеюсь, что это поможет!

18
задан Larsenal 13 August 2008 в 20:41
поделиться

7 ответов

Поскольку можно легко закончить с мертвой блокировкой (среди других проблем).

Для экс-клена, Ваш вторичный поток мог пытаться обновить управление UI, но управление UI будет ожидать ресурса, заблокированного вторичным потоком, который будет выпущен, таким образом, оба потока закончат тем, что ожидали друг друга для окончания. Поскольку другие прокомментировали, что эта ситуация не уникальна для кода UI, но особенно распространена.

На других языках, таких как C++ Вы свободны попытаться сделать это (без исключения, выданного как в WinForms), но Ваше приложение может заморозить и прекратить отвечать, должен мертвая блокировка происходить.

Кстати, можно легко сказать потоку UI, что Вы хотите обновить управление, просто создать делегата, затем назовите (асинхронный) метод BeginInvoke на том управлении, передающем его Ваш делегат. Например,

myControl.BeginInvoke(myControl.UpdateFunction);

Это - эквивалент выполнению C++ / MFC PostMessage от рабочего потока

9
ответ дан 30 November 2019 в 06:51
поделиться

я думаю, что это - блестящий вопрос - и я думаю, что существует потребность лучшего ответа.

, Конечно, единственная причина состоит в том, что существует что-то в платформе где-нибудь, которая не очень ориентирована на многопотоковое исполнение.

, Что "что-то" - почти каждый член экземпляра на каждом управлении в Системе. Windows. Формы.

документация MSDN для многих средств управления в Системе. Windows. Формы, если не все они, говорят "Какие-либо общедоступные помехи (Совместно использованный в Visual Basic), члены этого типа ориентированы на многопотоковое исполнение. Любые члены экземпляра, как гарантируют, не будут ориентированы на многопотоковое исполнение".

Это означает, что члены экземпляра такой как TextBox.Text {get; set;} не повторно используемы .

Создание каждого из тех ориентированных на многопотоковое исполнение членов экземпляра могло представить много издержек, в которых не нужно большинство приложений. Вместо этого разработчики платформы .NET решили, и я думаю правильно, что нагрузка синхронизирующегося доступа к средствам управления формами от нескольких потоков должна быть помещена на программиста.

[Редактирование]

, Хотя этот вопрос только спрашивает, "почему" вот ссылка на статью, которая объясняет "как":

, Как к: Выполните Ориентированные на многопотоковое исполнение Вызовы к элементам управления Windows Forms на MSDN

http://msdn.microsoft.com/en-us/library/ms171728.aspx

25
ответ дан 30 November 2019 в 06:51
поделиться

Это - так, чтобы у Вас не было двух вещей, пытающихся обновить управление одновременно. (Это могло произойти, если ЦП переключается на другой поток посреди записи-чтения), Та же причина, необходимо использовать взаимные исключения (или некоторая другая синхронизация) при доступе к совместно используемым переменным между несколькими потоками.

Редактирование:

На других языках, таких как C++ Вы свободны попытаться сделать это (без исключения, выданного как в WinForms), но Вы закончите тем, что учились на горьком опыте!

Ahh да... Я переключаюсь между C/C++ и C#, и поэтому было немного более универсальным затем, я должен был быть, извините... Он корректен, Вы можете делать это в C/C++, но он возвратится, чтобы укусить Вас!

1
ответ дан 30 November 2019 в 06:51
поделиться

Назад в 1.0/1.1 никакое исключение не было выдано во время отладки, что Вы получили, вместо этого был неустойчивый сценарий зависания времени выполнения.Мило!:) Поэтому с 2,0 они заставили этот сценарий выдать исключение и вполне справедливо так.

истинная причина для этого, вероятно (как Adam Haile заявляет), некоторая проблема параллелизма / пышная проблема. Обратите внимание что нормальный API.NET (такой как TextBox. Текст = "Привет" ;) переносится, ОТПРАВЛЯЮТ команды (которые требуют незамедлительного принятия мер), который может создать проблемы, если выполнено на отдельном потоке от того это действия обновление. Используя использование Invoke/BeginInvoke POST вместо этого, который ставит действие в очередь.

[еще 113] информация об ОТПРАВЛЯЮТ и POST сюда .

2
ответ дан 30 November 2019 в 06:51
поделиться

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


настоящая причина больше имеет отношение к условиям состязания и отводит назад в древние времена Win32. Я не могу объяснить детали здесь, ключевые слова являются насосами сообщения, события WM_PAINT и тонкие различия между "ОТПРАВЛЯЮТ" и "POST".


Дополнительная информация может быть найдена здесь здесь и здесь .

7
ответ дан 30 November 2019 в 06:51
поделиться

Также была бы потребность реализовать синхронизацию в функциях обновления, которые чувствительны к тому, чтобы быть названным одновременно. Выполнение этого для элементов UI было бы дорогостоящим и в приложении и в уровнях ОС, и абсолютно избыточным для подавляющего большинства кода.

Некоторые API позволяют изменять владение текущего потока системы, таким образом, Вы можете временно (или постоянно) системы обновления от других потоков, не будучи должен обратиться для межраспараллеливания коммуникации.

1
ответ дан 30 November 2019 в 06:51
поделиться

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

-1
ответ дан 30 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: