Продолжайте получать сообщение «Межпоточная операция недействительна» при попытке отобразить строку меню значка уведомления.

Это не обычная BS "Corss-Thread opeartion", поэтому, пожалуйста, не публикуйте очевидные решения.

Это то, что уже несколько дней сводит меня с ума.

У меня NotifyIcon, с привязанным ContextMenuStrip. Все работает как надо, но иногда (и я не могу вспомнить точные шаги для воспроизведения этого) я получаю исключение между потоками. Весь мой доступ к _3 _ / _ 4_ дополняется Invoke cr * p, но все же - когда пользователь щелкает правой кнопкой мыши значок уведомления - возникает исключение.

Это полные данные из исключения:

Message: Межпоточная операция недействительна: Control '' получен из потока, отличного от потока, в котором он был создан.

Call stack:

в System.Windows.Forms.Control.get_Handle ()

в System.Windows.Forms.Control.SetBoundsCore (Int32 x, Int32 y, ширина Int32, высота Int32, указано BoundsSpecified)

в System.Windows.Forms.ToolStrip.SetBoundsCore (Int32 x, Int32 y, ширина Int32, высота Int32, указано BoundsSpecified)

в System.Windows.Forms.ToolStripDropDown.SetBoundsCore (Int32 x, Int32 y, ширина Int32, высота Int32, указано BoundsSpecified)

в System.Windows.Forms.Control.SetBounds (Int32 x, Int32 y, ширина Int32, высота Int32, указано BoundsSpecified)

в System.Windows.Forms.Control.set_Location (значение точки)

в System.Windows.Forms.ToolStripDropDown.Show (Int32 x, Int32 y)

в System.Windows.Forms.ContextMenuStrip.ShowInTaskbar (Int32 x, Int32 y)

в System.Windows.Forms.NotifyIcon.ShowContextMenu ()

в System.Windows.Forms.NotifyIcon.WndProc (сообщение и сообщение)

в System.Windows.Forms.NotifyIcon.NotifyIconNativeWindow.WndProc (Сообщение & m)

в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

в System.Windows.Forms.UnsafeNativeMethods.PeekMessage (MSG и сообщение, HandleRef hwnd, Int32 msgMin, Int32 msgMax, Int32 удалить)

в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32 dwComponentID, причина Int32, Int32 pvLoopData)

в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32, контекст ApplicationContext)

в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (причина Int32, контекст ApplicationContext)

в System.Windows.Forms.Application.Run (форма mainForm)

в StarLIMS.Grabber.Manager.Program.Main (String [] args) в D: \ SDMS14SP2 \ StarLIMS.Grabber \ StarLIMS.Grabber.Manager \ Program.cs: строка 34

в System.AppDomain._nExecuteAssembly (сборка сборки, аргументы String [])

в System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args)

в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()

в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта)

в System.Threading.ExecutionContext.Run (контекст выполнения ExecutionContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart ()


person Nissim    schedule 05.12.2010    source источник
comment
Обратите внимание, что сообщение об исключении - это точное сообщение, которое я получаю, значение внутри '' пусто   -  person Nissim    schedule 05.12.2010
comment
Возможно ли, что NotifyIcon создается не в основном потоке, а в другом потоке?   -  person Doggett    schedule 05.12.2010
comment
не могли бы вы опубликовать Invoke cr * p, который вы допустили к ContextMenuStrip/NotifyIcon?   -  person The Scrum Meister    schedule 05.12.2010
comment
Что происходит, когда пользователь щелкает правой кнопкой мыши? Мы можем увидеть этот код?   -  person Tony Abrams    schedule 05.12.2010
comment
@Doggett: Спасибо за освещение - я создаю NotifyIcon в OnLoad, а не в конструкторе - я думаю, что это исправило. большое спасибо   -  person Nissim    schedule 05.12.2010


Ответы (1)


Как указал Доггетт - мой ContextMenuStrip был инициализирован под OnLoad, а не ctor ... как только я переместил его в ctor - проблема исчезла.

person Nissim    schedule 05.12.2010
comment
Вы просто проигнорировали проблему. На самом деле OnLoad работал не в том потоке. Это рано или поздно убьет вас по заднице. Установите на нем точку останова. - person Hans Passant; 05.12.2010
comment
Для меня это звучит как обычная чушь "Corss-Thread opeartion". Я не буду публиковать очевидные решения о том, как вы можете решить проблемы с потоками, но вам действительно стоит это сделать. - person Cody Gray; 05.12.2010