2013-07-09 4 views
0

У меня проблема в моем приложении WPF, в котором по существу есть 2 окна, окно входа в систему и окно панели мониторинга, и я получаю ненулевые ссылочные исключения с перерывами при загрузке этих окон. Типичное исключение выглядит следующим образом (dashbaord)nullreferenceexception при создании окна xaml

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.

Я начинаю свою панель с помощью 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(); 
     ...... 
    } 
} 

Я очень ценю помощь в этом, как я хорошо и поистине тупит, поскольку в API окон очень глубже запущен нулевой рефлекс.

+1

Как выглядит ваш App.xaml? Похоже, что это может быть попытка загрузить некоторые встроенные ресурсы. – rrhartjr

+0

У меня нет App.xaml, если вы имеете в виду мою Dashboard.xaml его здесь [http://pastebin.ca/2423000] – rendezz

+0

Вы установили свой DataContext? –

ответ

1

ОК, поэтому я узнал, что происходит, хотя и на довольно высоком уровне, но, похоже, я не могу запустить 2 ui одновременно. Как я сказал в своем вопросе, я запускаю учетную запись ui и dashboard ui, и я запускаю их так, как описано выше, это начало потока с состоянием STA Apartment, новый поток, а затем новый класс окна входа в систему и передает его диспетчер. Но после запуска нового потока основной поток идет вперед и начинает свою работу над окном панели инструментов тем же способом, и, как выясняется, некоторая часть этого процесса не может запускаться одновременно с другим потоком. Не знаю, почему, но я решил это.

Так в основном код для запуска пользовательского интерфейса теперь выглядеть так

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, инициализируются по одному без перекрытия и это решило проблему.

Смежные вопросы