我的WPF应用程序中存在一个问题,它本质上有2个窗口,一个登录窗口和一个仪表板窗口,当我加载这些窗口时,我会间歇性地获得空引用异常。典型的例外情况如下(dashbaord)
Application: BlitsMe.Agent.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException
Stack:
at System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Insert(System.__Canon, System.__Canon, Boolean)
at MS.Internal.AppModel.ResourceContainer.GetResourceManagerWrapper(System.Uri, System.String ByRef, Boolean ByRef)
at MS.Internal.AppModel.ResourceContainer.GetPartCore(System.Uri)
at System.IO.Packaging.Package.GetPart(System.Uri)
at System.Windows.Application.LoadComponent(System.Object, System.Uri)
at BlitsMe.Agent.UI.WPF.Dashboard..ctor(BlitsMe.Agent.BlitsMeClientAppContext)
at BlitsMe.Agent.BlitsMeClientAppContext.RunDashboard()
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart()
这是一个模糊的错误。深入loadcomponent类。
我在我的主AppContext类中使用2个方法启动仪表板,如下所示
internal void SetupAndRunDashboard()
{
if (DashboardUiThread == null)
{
DashboardUiThread = new Thread(RunDashboard) { Name = "dashboardUIThread" };
DashboardUiThread.SetApartmentState(ApartmentState.STA);
DashboardUiThread.Start();
}
}
private void RunDashboard()
{
UIDashBoard = new Dashboard(this);
Dispatcher.Run();
}
我的仪表板构造函数看起来像这样
public partial class Dashboard : Window
{
public Dashboard(BlitsMeClientAppContext appContext)
{
this.InitializeComponent();
......
}
}
我真的非常感谢这方面的帮助,因为我很好并且真正难倒,因为它在Windows API的深处就是抛出了空引用。
答案 0 :(得分:1)
好的,所以我发现了发生了什么,虽然处于相当高的水平,但似乎我不能同时开始2 ui。正如我在我的问题中所述,我运行登录ui和仪表板ui,我以上述方式启动它们,即启动一个具有STA Apartment状态的线程,新线程然后new是登录窗口类并将其移交给调度员。但是在新线程启动之后,主线程继续并以相同的方式在仪表板窗口上开始工作,事实证明,该进程的某些部分不能与另一个线程同时运行。不知道为什么,但多数民众赞成我如何解决它。
所以基本上启动ui的代码现在看起来像这样
private AutoResetEvent _dashboardStartWaitEvent = new AutoResetEvent(false);
internal void SetupAndRunDashboard()
{
if (DashboardUiThread == null)
{
DashboardUiThread = new Thread(RunDashboard) { Name = "dashboardUIThread" };
DashboardUiThread.SetApartmentState(ApartmentState.STA);
DashboardUiThread.Start();
_dashboardStartWaitEvent.Wait();
}
}
private void RunDashboard()
{
UIDashBoard = new Dashboard(this);
_dashboardStartWaitEvent.Set();
Dispatcher.Run();
}
因此主线程在进行之前等待ui被初始化,因此ui被一次初始化而没有重叠,这解决了这个问题。