Вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого - PullRequest
0 голосов
/ 05 сентября 2011

Я знаю, на SO много подобных вопросов.Но у меня довольно странная ситуация: я получаю это исключение, пока оно выполняется внутри Dispatcher.CurrentDispatcher.Invoke.Я понятия не имею, как это исправить.

Вот мой StackTrace (вы можете видеть, что диспетчер там вызывается):

   at System.Windows.Input.InputManager..ctor()
   at

System.Windows.Input.InputManager.GetCurrentInputManagerImpl() в System.Windows.Input.KeyboardNavigation..ctor () в System.Windows.FrameworkElement.FrameworkServices..ctor () в System.Windows.FrameworkElement.EnsureFrameworkServices () в System.Windows.FrameworkElement..ctor () вSystem.Windows.Controls.Control..ctor () в System.Windows.Controls.UserControl..ctor () в MCC.PresentationUtilities.ClosingAwareViewModelUserControl..ctor () в MCC.TherapyDeviceManager.PatientDetailUI.Views.PatientDetailView) в D: \ WTS \ WTS3 \ WTS \ MCC.\ WTS3 \ WTS \ MCC.TherapyDeviceManager.MultipleViewHost \ Managers \ TabItemFactory \ PatientTabItemFactory.cs: строка 41 at MCC.TherapyDeviceManager..TherapyDeviceManager.MultipleViewHost.(SelectedPatientChangedEventArgs PatientInfo) в D: \ WTS \ WTS3 \ WTS \ MCC.TherapyDeviceManager.MultipleViewHost \ Managers \ PatientEventsManager.cs: строка 75 в MCC.TherapyDeviceManager.MultipleViewHost.Mant.WTS3 \ WTS \ MCC.TherapyDeviceManager.MultipleViewHost \ Менеджеры \ PatientEventsManager.cs: строка 41 в Microsoft.Practices.Composite.Events.EventSubscription 1.InvokeAction(Action 1, аргумент TPayload) в D: \ WTS \ WTS3 \ WTS \ MCC.TherapyDeviceManager.Definitions \ Prism \ EventSubscription.cs: строка 122 вMicrosoft.Practices.Composite.Events.EventSubscription 1.<>c__DisplayClass2.<GetExecutionStrategy>b__0(Object[] arguments) in D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\EventSubscription.cs:line 108 at Microsoft.Practices.Composite.Events.EventBase.InternalPublish(Object[] arguments) in D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\EventBase.cs:line 69 at Microsoft.Practices.Composite.Presentation.Events.CompositePresentationEvent 1. Опубликовать (полезная нагрузка TPayload) в D: \ WTS \ WTS3 \ WTS \ MCC.TherapyDeviceManager.Definitions \ Prism \ CompositePresentationEvent.cs: строка 168 в MCC.TherapyDeviceManager.DataRecordManager. <> C_ DisplayClass5.b _4 () в D: \ WTS \ WTS3 \ WTS \ MCC.TherapyDeviceManager.DeviceManager \ DataRecordManager.cs: строка 247 в System.Windows.Threading.ExceptionWrapper.InternalRealCall (Обратный вызов делегата, аргументы объекта, Int32 numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (источник объекта, метод делегата, аргументы объекта, Int32 numArgs, делегат catchHandler) в System.Windows.Threading.DispatcherOperation.InvokeImpl () в системе.Windows.Threading.DispatcherOperation.InvokeInSecurityContext (состояние объекта) в системе.Threading.ExecutionContext.runTryCode (Object userData) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (код TryCode, CleanupCode backoutCode, Object userData) в System.Threading.ExecutionContext, обратный вызов состояния объектаThreading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение ignoreSyncCtx)в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Windows.Threading.DispatcherOperation.Invoke () в System.Windows.Threading.Dispatcher.ProcessQueue () в System.Windows.Threading.Dispatcher.WndProcHook (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & обрабатываются) в MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, Intl.(Объект o) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, Int32 numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (источник объекта, метод делегата, объектные аргументы, Int32 numArgs, делегат catchHandler).в System.Windows.Threading.Dispatcher.InvokeImpl (приоритет DispatcherPriority, тайм-аут TimeSpan, метод Delegate, аргументы объекта, Int32 numArgs) в MS.Win32.HwndSubclass.SubclassWndProc (hwnd IntPtr, Int32 msg, IntPtr wPm, л.с.aram) в MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & msg) в System.Windows.Threading.Dispatcher.PushFrameImpl (фрейм DispatcherFrame) в System.Windows.Threading.Dispatcher.PushFrame (фрейм DispatcherFrame) в System.Windows..Wait (TimeSpan timeout) в System.Windows.Threading.Dispatcher.InvokeImpl (приоритет DispatcherPriority, TimeSpan timeout, метод Delegate, аргументы объекта, Int32 numArgs) в System.Windows.Threading.Dispatcher.Invoke (метод Delegate, объект [] args) в MCC.TherapyDeviceManager.DeviceManager.DataRecordManager.DataImportedIntoDb (Пациент пациент, обнаруженный прибор обнаружилDevice, DataRecord dataRecord) в D: \ WTS \ WTS3 \ WTS \ MCC.TherapyDeviceManager.DeviceManager \ MMSager.DeviceManager.DataRecordManager.Process (DetectedDeviceInfo обнаруженияDeviceInfo) в D: \ WTS \ WTS3 \ WTS \ MCC.TherapyDeviceManager.DeviceManager \ DataRecordManager.cs: строка 66 в MCC.TherapyDeviceManager.DeviceManager.DeviceToDaverSavernager.CreateOrUpdateDeviceEntity (IDeviceDataInfo deviceDataInfo) в D: \ WTS \ WTS3 \ WTS \ MCC.TherapyDeviceManager.DeviceManager \ DeviceToDatabaseSaverManager.cs: строка 106 в MCC.TherapyDeviceDeviceDeviceMeagerDeviceMeagerDeviceManager.DeviceManager.DeviceMoager\ WTS \ MCC.TherapyDeviceManager.DeviceManager \ DeviceToDatabaseSaverManager.cs: строка 88 в MCC.cs: строка 70 в MCC.Devices.DeviceDetection.ConnectionManagers.ConnectionManagerAggregator.OnDeviceDetected (DetectedDeviceInfoEventArgs e) в D: \ WTS \ WTS3 \ WTS \ MCC.Devices.DetectService \ ConnectionManagers \ Соединение.Dection.EeC:.ConnectionManagers.ConnectionManagerAggregator.DeviceDetectedHandler (Отправитель объекта, DetectedDeviceInfoEventArgs e) в D: \ WTS \ WTS3 \ WTS \ MCC.Devices.DetectService \ ConnectionManagers \ ConnectionManagerAggregator.cs: строка 58 в MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 2.OnDeviceDetected(DetectedDeviceInfoEventArgs e) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 33 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 2.AddDevice (соединение TConnection, устройство DeviceData \) в D: W \ W\ MCC.Devices.DetectService \ ConnectionManagers \ SpecificConnectionManagerBase.cs: строка 258 в MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 2.FoundDevice(TConnection connection, DeviceData newlyDetectedDevice) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 229 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 2.DetectDeviceOnAquiredConnection (подключение к TConnection \ WSTS \ WTS).\ ConnectionManagers \ SpecificConnectionManagerBase.cs: строка 185 вMCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 2.Poll(TConnection connection) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 166 at MCC.Devices.DeviceDetection.ConnectionManagers.Managers.SdConnectionManager.Poll(FileConnection connection) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\Managers\SdConnectionManager.cs:line 51 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 2.PollingCycle (объект tokenObject, TConnectionMetadata детектированConnectionMetadata) в D: \ WTS \ WTS3 \ WTS \ MCC.Devices.DetectSanagerManager_Player_MB21015 *

1 Ответ

2 голосов
/ 05 сентября 2011

Если вы находитесь в потоке, отличном от основного потока, использование Dispatcher.CurrentDispatcher сохранит код, выполняемый в вашем текущем потоке, но не переместит его в основной поток. И вы не можете создавать компоненты пользовательского интерфейса (например, элементы управления) в других потоках.

Что вам нужно сделать, это использовать свойство Dispatcher какого-либо объекта пользовательского интерфейса. Если ни один не доступен для вас, вы можете использовать Application.Current.

...