0

基本的に 2 つのウィンドウ (ログイン ウィンドウとダッシュボード ウィンドウ) を持つ WPF アプリケーションに問題があり、これらのウィンドウを読み込むと断続的に null 参照例外が発生します。典型的な例外は次のようになります (ダッシュボード)

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();
        ......
    }
}

null refがスローされているのはWindows APIの奥深くにあるため、私は本当に困っているので、これについて本当に助けていただければ幸いです。

4

1 に答える 1

1

OK、かなり高いレベルではありますが、何が起こっているのかわかりましたが、2 つの UI を同時に開始することはできないようです。質問で述べたように、ログイン ui とダッシュボード ui を実行し、上記の方法でそれらを開始します。つまり、STA アパートメント状態のスレッドを開始し、新しいスレッドがログイン ウィンドウ クラスになり、それをに渡します。ディスパッチャー。しかし、新しいスレッドが開始された後、メイン スレッドが先に進み、同じ方法でダッシュボード ウィンドウで作業を開始します。結局のところ、そのプロセスの一部は別のスレッドと同時に実行できません。理由はわかりませんが、それが私がそれを解決した方法です。

したがって、基本的に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 は重複することなく一度に 1 つずつ初期化され、これで問題が解決しました。

于 2013-07-10T18:06:53.867 に答える