0

我正在尝试在另一个线程中为我的应用程序加载我的插件。该过程非常耗时,并且应用程序在启动时会冻结很长时间。系统工作如下:

xml 文件定义应添加到 UI 的控件和类型。一个类现在读取 XML 并创建控件。这些是由 Invoking 创建的(使用主 UI-Thread 的 Dispatcher)。

在这种情况下,我正在创建一个 RibbonTabItem(来自 Codeplex 的 Fluent Ribbon)。一切正常,直到我将此控件添加到功能区本身。即使通过调度程序调用也会发生这种情况。但是一旦这条线被调用:

RibbonTabItem i = item;
uiDispatcher.Invoke(() => this._ribbon.Tabs.Add(i));

我得到这个异常堆栈跟踪:

在 System.Windows.Freezable.EnsureConsistentDispatchers(DependencyObject owner, DependencyObject child) at System.Windows.Freezable.OnFreezablePropertyChanged(DependencyObject oldValue, DependencyObject newValue, DependencyProperty property) at System.Windows.Media.RenderData.PropagateChangedHandler(EventHandler handler, Boolean added)在 System.Windows.UIElement.RenderClose(IDrawingContent newContent) 在 System.Windows.Media.VisualDrawingContext.CloseCore(RenderData renderData) 在 System.Windows.Media.RenderDataDrawingContext.DisposeCore() 在 System.Windows.Media.DrawingContext.System.IDisposable .Dispose() 在 System.Windows.Media.RenderDataDrawingContext.Close() 在 System.Windows.UIElement.Arrange(Rect finalRect) 在 MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement 元素,System.Windows.Controls.ContentPresenter.ArrangeOverride 的大小排列大小)在 System.Windows.FrameworkElement.ArrangeCore(矩形 finalRect)在 System.Windows.UIElement.Arrange(矩形 finalRect)在 System.Windows.Controls.Border。 ArrangeOverride(Size finalSize) 在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) 在 System.Windows.UIElement.Arrange(Rect finalRect) 在 System.Windows.Controls.Control.ArrangeOverride(Size attachBounds) 在 System.Windows.FrameworkElement。在 System.Windows.Controls.Border.ArrangeOverride(Size finalSize) 在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) 在 System.Windows.UIElement 的 System.Windows.UIElement.Arrange(Rect finalRect) 的 ArrangeCore(Rect finalRect)。在 System.Windows.Controls.Grid 中排列(矩形 finalRect)。在 System.Windows.UIElement.Arrange(Rect finalRect) 在 System.Windows.Controls.Control.ArrangeOverride(Size attachBounds) 在 System.Windows.FrameworkElement. ArrangeCore(Rect finalRect) 在 System.Windows.UIElement.Arrange(Rect finalRect) 在 Fluent.RibbonTabsContainer.ArrangeOverride(Size finalSize) 在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) 在 System.Windows.UIElement.Arrange(Rect finalRect) ) 在 System.Windows.Controls.ScrollContentPresenter.ArrangeOverride(Size translateSize) 在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) 在 System.Windows.UIElement.Arrange(Rect finalRect) 在 System.Windows.Controls.Grid.ArrangeOverride( System.Windows 中的大小排列大小)。FrameworkElement.ArrangeCore(Rect finalRect) 在 System.Windows.UIElement.Arrange(Rect finalRect) 在 System.Windows.Controls.Control.ArrangeOverride(Size attachBounds) 在 System.Windows.Controls.ScrollViewer.ArrangeOverride(Size translateSize) 在系统。 Windows.FrameworkElement.ArrangeCore(Rect finalRect) 在 System.Windows.UIElement.Arrange(Rect finalRect) 在 System.Windows.Controls.DockPanel.ArrangeOverride(Size translateSize) 在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) 在 System。 Windows.UIElement.Arrange(Rect finalRect) 在 System.Windows.ContextLayoutManager.UpdateLayout() 在 System.Windows.UIElement.UpdateLayout() 在 Fluent.RibbonTabControl.UpdateSelectedContent() 在 Fluent.RibbonTabControl.OnSelectionChanged(SelectionChangedEventArgs e) 在系统。 Windows.控件。Primitives.Selector.InvokeSelectionChanged(列表1 unselectedInfos, List1 selectedInfos) 在 System.Windows.Controls.Primitives.Selector.SelectionChanger.End() 在 System.Windows.Controls.Primitives.Selector.SelectionChanger.SelectJustThisItem(ItemInfo info, Boolean assumeInItemsCollection) 在 System.Windows.Controls.Primitives.Selector .OnSelectedIndexChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 在 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 在 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 在 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 在 System.Windows。 DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry,在 System.Windows.Controls.Primitives.Selector.OnItemsChanged(NotifyCollectionChangedEventArgs e) 在系统的 Fluent.RibbonTabControl.OnItemsChanged(NotifyCollectionChangedEventArgs e) 的 System.Windows.DependencyObject.CoerceValue(DependencyProperty dp) 的 Boolean coerceWithDeferredReference、Boolean coerceWithCurrentValue、OperationType operationType)。 Windows.Controls.ItemsControl.OnItemCollectionChanged2(Object sender, NotifyCollectionChangedEventArgs e) 在 System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) 在 System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) 在 System.Windows。 Controls.ItemCollection.OnViewCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) 在系统。Windows.WeakEventManager.ListenerList1.DeliverEvent(Object sender, EventArgs e, Type managerType) at System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args) at System.Collections.Specialized.CollectionChangedEventManager.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) at MS.Internal.Controls.InnerItemCollectionView.Insert(Int32 index, Object item) at System.Windows.Controls.ItemCollection.Insert(Int32 insertIndex, Object insertItem) at Fluent.Ribbon.OnTabsCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) at System.Collections.ObjectModel.ObservableCollection1.OnCollectionChanged(NotifyCollectionChangedEventArgs e) 在 System.Collections.ObjectModel.ObservableCollection 1.InsertItem(Int32 index, T item) at System.Collections.ObjectModel.Collection1.Add(T item) 在 FGCore.GUI.MenuSystem.RibbonUIHost.<> c_DisplayClass12.b_4() 在 d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore.GUI\MenuSystem\RibbonUIHost.cs:System.Windows.Threading.Dispatcher.Invoke 的第 77 行(操作回调,DispatcherPriority 优先级,CancellationToken d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore 中 FGCore.GUI.MenuSystem.RibbonUIHost.SortHulls() 的 System.Windows.Threading.Dispatcher.Invoke(操作回调)的取消令牌、时间跨度超时)。 GUI\MenuSystem\RibbonUIHost.cs:FGCore.GUI.MenuSystem.UIHost.Add(String id, FrameworkElement element, Int32 order, PropertiesCollection meta) 中的第 77 行,位于 d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\ FGCore.GUI\MenuSystem\UIHost.cs: FGCore.Addin.Integrity.IntegrationPipeline的第 54 行。<>c_DisplayClass1a.b_13() in d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore.Addin\Integrity\IntegrationPipeline.cs:System.Windows.Threading.DispatcherOperation.InvokeDelegateCore() 处 System.Windows.Threading 处的第 486 行.DispatcherOperation.InvokeImpl() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task ) 在 System.Windows.Threading.DispatcherOperation.Wait(TimeSpan timeout) 在 System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherOperation operation, CancellationToken cancelToken, TimeSpan timeout) 在 System.Windows.Threading.Dispatcher.Invoke(Action callback, DispatcherPriority优先,System.Windows.Threading.Dispatcher.Invoke(操作回调)处的 CancellationToken 取消令牌,TimeSpan 超时)在 d:\ Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore.Addin\Integrity\IntegrationPipeline.cs: d:\Sicherung\Visual Studio 中 FGCore.Addin.Integrity.IntegrationPipeline.ExtendRibbonHost(XmlElement hostNode, IntegrationDescription desc) 的第 486 行\Workspace\ProjectFlowerGrid\src\Core\FGCore.Addin\Integrity\IntegrationPipeline.cs: d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\ 中 FGCore.Addin.Integrity.IntegrationPipeline.ProcessExtensibility(IntegrationDescription 描述)的第 392 行核心\FGCore。Addin\Integrity\IntegrationPipeline.cs:d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore.Addin\AddinProvider.cs 中 FGCore.Addin.AddinProvider.RunAddin(Guid id,SettingsFile 注册表)的第 359 行: d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore.Addin\AddinProvider.cs 中 FGCore.Addin.AddinProvider.RunAddins() 的第 348 行:FGCore.Addin.AddinCore.RunAddins() 中的第 313 行d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore.Addin\AddinCore.cs:ProjectFlowerGrid.IDE.b_ 的第 91 行\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore.Addin\AddinProvider.cs: d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core 中 FGCore.Addin.AddinCore.RunAddins() 的第 313 行\FGCore.Addin\AddinCore.cs:ProjectFlowerGrid.IDE.b_ 的第 91 行\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core\FGCore.Addin\AddinProvider.cs: d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\Core 中 FGCore.Addin.AddinCore.RunAddins() 的第 313 行\FGCore.Addin\AddinCore.cs:ProjectFlowerGrid.IDE.b_ 的第 91 行1() 在 d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\ProjectFlowerGrid.ApplicationBase\IDE.cs: System.Threading.Tasks.Task.InnerInvoke() 在 System.Threading.Tasks.Task.Execute 的第 253 行() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System. ProjectFlowerGrid.IDE.d 上的 Runtime.CompilerServices.TaskAwaiter.GetResult()_2.MoveNext() in d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\ProjectFlowerGrid.ApplicationBase\IDE.cs:line 253 --- 从先前抛出异常的位置结束堆栈跟踪---在 System. Runtime.CompilerServices.AsyncMethodBuilderCore.b__0(Object state) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args , Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.DispatcherOperation.InvokeImpl() at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state ,Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Windows.Threading.DispatcherOperation .Invoke() 在 System.Windows.Threading.Dispatcher.ProcessQueue() 在 System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&handled) 在 MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& 处理) 在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 MS .Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 在 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 在 System.Windows .Threading.Dispatcher.PushFrame(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.Run() at System.Windows.Application.RunDispatcher(Object ignore) at System.Windows.Application.RunInternal(Window window) at System.Windows .Application.Run(窗口窗口)在系统。d:\Sicherung\Visual Studio\Workspace\ProjectFlowerGrid\src\ProjectFlowerGrid.ApplicationBase\obj\Debug\App.g.cs 中 ProjectFlowerGrid.App.Main() 的 Windows.Application.Run():System.AppDomain 的第 50 行._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

我已经读到这可能是由在一个线程中创建并在另一个线程中使用的资源(如画笔)引起的。很有道理。但我真的不知道如何解决这个问题。如果我必须冻结所有资源,我怎么能不手动为每个 Freezable 执行此操作?

还有其他想法吗?

谢谢 :)

4

1 回答 1

0

请原谅这个可悲的错误。我忽略了我真的在并行线程中创建了可冻结的资源。那是一些刷子。我只是还没有看到代码,因为它只是这个庞大类的一小部分。

我将它包装到 UI 调度程序的调用中,现在不再有异常。

再次,对不起。我写这个有点快。不会再发生了。

于 2014-03-30T16:18:54.507 回答