3

.NET3.5アプリケーションで新しいUIスレッドを作成するための次のコードがあります。

  private void OnCreateNewWindow(object sender, RoutedEventArgs e)
        {
            var rect = this.RestoreBounds;
            double l = rect.Left;
            double wth = rect.Width;
            double t = rect.Top;
            double ht = rect.Height;
            var progressThread = new Thread(() =>
            {

                progressWindow = new ProgressWindow(Visibility.Collapsed) { Height = 50, Width = 50 };
                progressWindow.WindowStartupLocation = WindowStartupLocation.Manual;
                progressWindow.Left = l + (wth - progressWindow.Width) / 2;
                progressWindow.Top = t - 35 + (ht - progressWindow.Height) / 2;

                progressWindow.Show();
                progressWindow.Activate();
                Dispatcher.Run();
            });

            progressThread.SetApartmentState(ApartmentState.STA);
            progressThread.Start();
        }         

クラッシュはここに示されています: ここに画像の説明を入力してください

これは、32ビットバージョンのWindowsで完全に機能します。64ビットWindows7でPCを再起動したときにこのプログラムを初めて実行すると、Visual Studioを介して実行した場合、またはVisual Studioの外部でアプリケーションがクラッシュした場合に、null例外が発生します。

例外の詳細は乾燥しています:

System.NullReferenceException was unhandled

スタックトレースを以下に示します。

    [Managed to Native Transition]  
    WindowsBase.dll!MS.Win32.HwndWrapper.DestroyWindow(object args) + 0xfc bytes    
    WindowsBase.dll!MS.Win32.HwndWrapper.Dispose(bool disposing, bool isHwndBeingDestroyed) + 0xce bytes    
    WindowsBase.dll!MS.Win32.HwndWrapper.Dispose() + 0x15 bytes 
    PresentationCore.dll!System.Windows.Media.MediaContextNotificationWindow.DisposeNotificationWindow() + 0x22 bytes   
    PresentationCore.dll!System.Windows.Media.MediaContext.Dispose() + 0xba bytes   
    [Native to Managed Transition]  
    [Managed to Native Transition]  
    WindowsBase.dll!System.Windows.Threading.Dispatcher.ShutdownImplInSecurityContext(object state) + 0x47 bytes    
    mscorlib.dll!System.Threading.ExecutionContext.runTryCode(object userData) + 0x178 bytes    
    [Native to Managed Transition]  
    [Managed to Native Transition]  
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x62 bytes    
    WindowsBase.dll!System.Windows.Threading.Dispatcher.ShutdownImpl() + 0x87 bytes 
    WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame) + 0x121 bytes 
>   EMS.Controls.Dictionary.dll!EMS.Controls.Dictionary.Views.AuthenticateWindow.OnCreateNewWindow.AnonymousMethod() Line 56 + 0x5 bytes    C#
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x9b bytes    
    mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x4d bytes   

プログラムを再度実行し続けると、プログラム互換性アシスタントから、いくつかの互換性設定が適用されたことを示すメッセージが表示されます。次回プログラムを実行すると、この例外は発生しなくなります。誰かがこれを経験しましたか?

4

1 に答える 1

1

この問題は、アプリケーションの起動シーケンスに関係していました。アプリケーションの起動に必要な Web サービスへの認証を UI スレッドで実行できるように、進行状況ウィンドウは別の UI スレッドで作成されていました。MSDNのこのスレッドに基づくと、メインの UI スレッドで Web サービス メソッドを呼び出すことには問題があるようです。

幸いなことに、これは、Web サービス メソッドが UI スレッドで同期的に呼び出されるアプリケーション内の唯一の場所です。

After making changes to launch the progress window on the main UI thread while authentication to the webservice on a background thread, problem has not occurred so far. Interesting that this problem did not occur on other versions of Windows including Windows 7 x32.

于 2012-04-19T17:38:02.717 に答える