[C#] Метод Invoke
мля, ну зачем такие вопросы в форум? ну хоть бы мсдн почитал, чтоль?
Впринципе знал что такая реакция последует, но куда мне еще писать
ЗЫ: Если такие посты сильно напрягаю, создайте раздел "Для ламеров", думаю не помешает.
Я думаю, в данном случае (контрол TextBox) этот Invoke не нужен, потому что запрашивание текста из другого потока для этого контрола - не криминал. А вот всякие DataGrid'ы, деревья и т.п. без Invoke то ли исключения кидают, то ли в дедлок уходят
т.е. это у прогера "стиль" такой?
Executes the specified delegate on the thread that owns the control's underlying window handle.
А по-моему Invoke здесь нужен. Криминала конечно без него нет, но с ним правильней имхо.
он наверное ещё и все исключения ловит и на них пишет Trace.WriteLine
с ним правильней имхо.а можешь пояснить в чем "правильность" именно в этом конкретном примере?
Я например не могу ее уловить, согласен с - человек очень правильный и так привык .
а можешь пояснить в чем "правильность" именно в этом конкретном примере?правильность в том, что в какой-нибудь mono под embedded linux, который крутится на интеллектуальной зубочистке, без Invoke может и не сработаеть
потому что запрашивание текста из другого потока для этого контрола - не криминал.не понятно откуда это следует.
в msdn-е стандартная приписка:
Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
А вот всякие DataGrid'ы, деревья и т.п. без Invoke то ли исключения кидают, то ли в дедлок уходятТ.е. попробовал дернуть textBox.Text из другой потока, ничего не упало - поэтому можно так делать?
странный подход....
Да и в худшем случае там только кусок строки придёт, если между GetWindowTextLength и GetWindowText кто-то внезапно много буков вставит
а если наоборот? уберет,
или исходный код функции TextBox.Text в какой-нибудь патче или версии .net-а поменяется...
int windowTextLength = SafeNativeMethods.GetWindowTextLength(new HandleRef(this.window, this.Handle;
if (SystemInformation.DbcsEnabled)
{
windowTextLength = (windowTextLength * 2) + 1;
}
StringBuilder lpString = new StringBuilder(windowTextLength + 1);
UnsafeNativeMethods.GetWindowText(new HandleRef(this.window, this.Handle lpString, lpString.Capacity);
return lpString.ToString;
если уберёт - никаких проблем не будет
Respect
там действительно много потоков лезут в этот текстбокс.
UnsafeNativeMethods.GetWindowText(new HandleRef(this.window, this.Handle lpString, lpString.Capacity);Ровно перед вызовом этого метода я могу грохнуть это окно.
будет пустая строка, а эта функция ввернёт нуль (результат .NET все равно не проверяет, как видно)
PropertyStore тоже считается, что он thread safe?
Помимо совсем фатальных ошибок могут случиться ещё разные другие, логические и труднообнаруживаемые, типа текст окажется в каком-то промежуточном состоянии (относительно, например, текста в другом текстбоксе). Не понимаю, кстати, бурной радости насчёт того, что если текст удлиннился, то вернётся обрезанный кусок. Лучше бы вылетело по-моему.
А ещё, теоретически там может быть Чорная Магия с event queue. Типа раньше асинхронно вызвали какой-нибудь метод, а теперь вызываем другой и тот обязан вызваться раньше. Так делать нельзя, конечно, но иногда приходится.
ладно, у нас по-моему тема не туда ушла. Тут уже речь идёт о потоконебезопасности объектов. То есть объект меняется и читается одновременно. В принципе, если ты обложишь объект lock'ами или ReadWriteLocker'ами, этого можно избежать. Но к некоторым объектам (типа того же Grid, или GL-ного контекста) с объектом можно работать только в потоке, которые его породил, и тут уже никакими механизмами синхронизации этого не исправишь.
Оставить комментарий
nik93
Читал чужой код и наткнулся на вот такоев чем смысл Invoke, почему нельзя было просто написать