1

Windows Mobile 5 ベースのバーコード スキャナーで実行するアプリケーションを開発しています。クロス スレッド例外が発生し、アプリケーションが失敗することがあります。

このアプリケーションは C# 3.5 で記述され、Motorola EMDK for .NET の上に構築されていますが、 Smart Device Frameworkの一部も使用しています。

私のメイン フォームには、アプリケーションのコンテキストに基づいてコンテンツを変更するパネルがあります。すべてのビューは、共通のインターフェイス IContentView を共有します。

また、いくつかのバックグラウンド スレッドを使用して、デバイスが現在充電中かどうかを監視し (ユーザー ログアウトをトリガーします)、デバイスがサーバーに接続できるかどうかも監視します。

パネルで変更を呼び出すときに、変更中のコントロールで変更が確実に呼び出されるようにするために、ここから John Skeets の構築を使用しています。

    public void ShowContent(IContentView content)
    {
        contentPanel.Invoke(() =>
            {
                contentPanel.Controls.Clear();
                contentPanel.Controls.Add(content as UserControl);
                contentPanel.Focus();
            });
    }

contentPanel は System.Windows.Forms.Panel です。

しかし、私はまだ次の例外を受け取ります:

Control.Invoke must be used to interact with controls created on a separate thread.
   at Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar)
   at System.Windows.Forms.Control.get_Parent()
   at System.Windows.Forms.Control.ControlCollection.Add(Control value)
   at BarcodeScanner.MainView.MainForm.<>c__DisplayClass1e.<ShowContent>b__1d()
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at System.Windows.Forms.Control.TASK.Invoke()
   at System.Windows.Forms.Control._InvokeAll()
   at System.Windows.Forms.Control.WnProc(WM wm, Int32 wParam, Int32 lParam)
   at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
   at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
   at System.Windows.Forms.Application.Run(Form fm)
   at BarcodeScanner.Program.Main()

ここで何が欠けていますか?スレッドからパネルへの変更を正しくマーシャリングするために何か他のことをする必要がありますか?

どんなアドバイスでも大歓迎です。

4

1 に答える 1

2

私にとっては、への追加中に問題が発生したようcontent as UserControlですControls

どのスレッドIContentView contentが作成されたかを確認してください。メインスレッドではないと思いますが、これが問題である可能性があります。

こちらもご覧ください: WPF ではなく、WinForms でコントロールをクロススレッドで追加できるのはなぜですか?

したがって、これは Windows フォームでも「禁止」されているようですが、フレームワーク コードによって厳密にチェックされているわけではありません。

したがって、解決策は、メイン スレッドですべての GUI コントロールを作成することです。Invoke()

于 2015-02-27T09:24:48.093 に答える