0

このように定義された添付の動作があります..

    public static class FileBrowserBehaviour
{


    public static bool GetBrowsesOnClick(DependencyObject obj)
    {
        return (bool)obj.GetValue(BrowsesOnClickProperty);
    }

    public static void SetBrowsesOnClick(DependencyObject obj, bool value)
    {
        obj.SetValue(BrowsesOnClickProperty, value);
    }

    // Using a DependencyProperty as the backing store for BrowsesOnClick.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BrowsesOnClickProperty =
        DependencyProperty.RegisterAttached("BrowsesOnClick", typeof(bool), typeof(FileBrowserBehaviour), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(BrowsesOnClickChanged)));


    public static void BrowsesOnClickChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        FrameworkElement fe = obj as FrameworkElement;

        if ((bool)args.NewValue)
        {
            fe.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(OpenFileBrowser);
        }
        else
        {
            fe.PreviewMouseLeftButtonDown -= new MouseButtonEventHandler(OpenFileBrowser);
        }
    }

    static void OpenFileBrowser(object sender, MouseButtonEventArgs e)
    {
        var tb = sender as TextBox;
        if (tb.Text.Length < 1 || tb.Text=="Click to browse..")
        {
            OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "Executables | *.exe";
                if (ofd.ShowDialog() == true)
                {
                    Debug.WriteLine("Setting textbox text-" + ofd.FileName);
                    tb.Text = ofd.FileName;
                    Debug.WriteLine("Set textbox text");
                }
        }
    }
}

これは、テキスト ボックスをクリックすると OpenFileDialog が開き、完了したらファイル名をボックスに入力する、単純な添付ビヘイビアです。

おそらく 40% の時間は機能しますが、残りの時間はアプリ全体がハングします。この時点でのコール スタックは次のようになります。

[Managed to Native Transition]  

WindowsBase.dll!MS.Win32.UnsafeNativeMethods.GetMessageW(ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 バイト
WindowsBase.dll!System.Windows.Threading. Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 バイト WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame フレーム= {System.Windows.Threading.DispatcherFrame}) + 0x8b バイト WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame フレーム) + 0x49 バイト
WindowsBase.dll!System.Windows.Threading. Dispatcher.Run() + 0x4c バイト
PresentationFramework.dll!System.Windows.Application.RunDispatcher (オブジェクト無視) + 0x1e バイト
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window ウィンドウ) + 0x6f バイト PresentationFramework.dll!System.Windows.Application. Run(System.Windows.Window ウィンドウ) + 0x26 バイト PresentationFramework.dll!System.Windows.Application.Run() + 0x19 バイト Debugatron.exe!Debugatron.App.Main() + 0x5e バイト C# [Managed Transition にネイティブ]
[管理からネイティブへの移行]
mscorlib.dll!System.AppDomain.nExecuteAssembly(System.Reflection.Assembly アセンブリ、string[] args) + 0x19 バイト mscorlib.dll!System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel) + 0x6e バイト mscorlib.dll!System .Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 バイト mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext, string[] activationCustomData) + 0x65 バイト mscorlib.dll!System.Runtime.Hosting. ApplicationActivator.CreateInstance(System.ActivationContext アクティベーションコンテキスト) + 0xa バイト mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext アクティベーションコンテキスト) + 0x3e バイト
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 バイト
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(オブジェクトの状態) + 0x66 バイト
mscorlib.dll!System.Threading. ExecutionContext.Run(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクトの状態) + 0x6f バイト
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 バイト

さて、非同期処理を行っているときにこの種のことを見たことがありますが、その時点では何も起こっていません。生きているスレッドは UI スレッドだけです。また、ハングしたときは常に最後のデバッグステートメントを取得します。

誰かが私を正しい方向に向けることができますか? これは私を狂わせる !

4

2 に答える 2

1

ここにいくつかのほぼランダムな事実と質問があります、それはあなたを助けるかもしれません。

まず第一に、私はあなたの問題を再現することができませんでした。どんなに試しても。それは常に機能しました。

スタックトレースも私には良さそうです。メッセージの処理をループし続けます。何があなたを混乱させますか?ネイティブへの移行を管理しましたか?

WPFアプリケーションに1つのスレッドを含めることはできません。VSデバッガーの[スレッド]ウィンドウには何が表示されますか?

ブレークを押すと、メインスレッドスタックトレースにofd.ShowDialog()の呼び出しが表示され、.NET SystemEventsという名前の1つのワーカースレッドがWindowThreadProc()にとどまり、同期オブジェクトを待機します。何が見えますか?

どういうわけかデッドロックに陥ったようです。

OpenFileBrowser()内容をにラップしてみてくださいtry... catch{}。エラーはありますか?

于 2009-12-18T18:11:37.433 に答える
1

WPF アプリケーションで WPF WebBrowser コントロールを使用する非常に単純な WPF アプリケーションがあります。私はまったく同じ問題を抱えています。WPF WebBrowser コントロール (JavaScript を使用して Google Earth を起動) は、ウィンドウのサイズを水平方向に変更すると、約 75% の確率でフリーズします。上記とまったく同じスタック ダンプが得られます。別の PC (すべて XP SP3 を実行している) で実行可能ファイルをコピー/実行すると、正常に実行され、ハングすることはありません。また、マルチスレッドのより複雑なアプリもあり、この PC では同様のスタック ダンプ (スレッド ライブラリ内のメッセージも待機) でハングしますが、別の PC では発生しません。WPF WebBrowser コントロール アプリには、.Net 3.5 または 4.0 を対象としているかどうかにかかわらず、同じ問題があります。NETfx_Setupverifier を使用して .net のインストールが正しいことを確認しましたが、いずれかに問題があると思われます。net または .NET - COM 相互運用を不安定にする COM ユーティリティ。私のアプリは、相互運用の問題のために到着しない管理されていないイベント/メッセージを待機していると思います。また、WinForms/WinForm WebBrowser Control を使用して同じ単純なアプリを作成しましたが、そのアプリは同じ PC でハングすることはありません。

原因を追跡する方法について何か提案はありますか? 正しいことが確認されたにもかかわらず、.NET フレームワークを完全にアンインストール/再インストールすることを考えています。COM 側の異常をどこで探すべきかさえわかりません。

于 2010-06-17T08:44:03.447 に答える