0

コントロールの Text プロパティを別のスレッドから変更しようとしています。私はこれを行うためにこの方法を使用しています:

        public static void InvokeIfRequired(this Control control, MethodInvoker action)
        {
            if (control.InvokeRequired)
            {
                try
                {
                    control.Invoke(action);
                }
                catch (ObjectDisposedException) { }
                catch (InvalidAsynchronousStateException) { }
            }
            else
            {
                action();
            }
        }

このメソッドを使用すると、まだ'System.InvalidOperationException'例外が発生します。これに割り込むと、 であることがわかりますcontrol.InvokeRequiredfalse、実際には別のスレッドからアクセスされているように見えます??

実際のエラー メッセージでは、呼び出しようとしているコントロールと同じものは表示されません。むしろ、コントロールが存在するフォームを提供し、次のように述べています'Form1 accessed from a thread other than the thread it was created on'.

フォームをメソッドに渡そうとしましたがInvokeIfRequired、それでも例外が発生します。呼び出そうとしているコントロールは、デザイナーで作成されたものです。Form1.InvokeRequiredfalse

コントロールを編集するために使用しているコードは次のとおりです。

        private void StartUpdateThreads()  // called from the Form ctor
        {
            new Thread(new ThreadStart(this.TimeUpdater)).Start();
            new Thread(new ThreadStart(this.AccountBalanceUpdater)).Start();
        }

        private void TimeUpdater()
        {
            while (!this.IsDisposed)
            {
                Utilities.InvokeIfRequired(this, (MethodInvoker)(() =>
                    {
                        this.timestampLabel.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
                    }));
                Thread.Sleep(250);
            }
        }

コールスタックは次のとおりです。

    MyApp.exe!MyApp.MyAppToolbar.TimeUpdater.AnonymousMethod__0() Line 133 + 0x41 bytes 
    MyApp.exe!MyApp.Utilities.InvokeIfRequired(System.Windows.Forms.Control control, System.Windows.Forms.MethodInvoker action) Line 34 + 0xb bytes 
    MyApp.exe!MyApp.MyAppToolbar.TimeUpdater() Line 131 + 0x49 bytes

スタック トレースは次のとおりです。

    at System.Windows.Forms.Control.get_Handle()\r\n   
    at System.Windows.Forms.Control.get_InternalHandle()\r\n   
    at System.Windows.Forms.Control.get_CreateParams()\r\n   
    at System.Windows.Forms.Label.get_CreateParams()\r\n   
    at System.Windows.Forms.Control.SizeFromClientSize(Int32 width, Int32 height)\r\n   
    at System.Windows.Forms.Control.SizeFromClientSize(Size clientSize)\r\n   
    at System.Windows.Forms.Label.GetBordersAndPadding()\r\n   
    at System.Windows.Forms.Label.GetPreferredSizeCore(Size proposedConstraints)\r\n   
    at System.Windows.Forms.Control.GetPreferredSize(Size proposedSize)\r\n   
    at System.Windows.Forms.Label.GetPreferredSize(Size proposedSize)\r\n   
    at System.Windows.Forms.Control.get_PreferredSize()\r\n   
    at System.Windows.Forms.Label.AdjustSize()\r\n   
    at System.Windows.Forms.Label.OnTextChanged(EventArgs e)\r\n   
    at System.Windows.Forms.Control.set_Text(String value)\r\n   
    at System.Windows.Forms.Label.set_Text(String value)\r\n   
    at MyApp.MyAppToolbar.<TimeUpdater>b__0() in PATH\\TO\\FILE.cs:line 133\r\n   
    at MyApp.Utilities.InvokeIfRequired(Control control, MethodInvoker action) in PATH\\TO\\FILE.cs:line 34\r\n  MyApp.MyAppToolbar.TimeUpdater() in PATH\\TO\\FILE.cs:line 131\r\n   
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state)\r\n   
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)\r\n   
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)\r\n   
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)\r\n   
    at System.Threading.ThreadHelper.ThreadStart()

ここで誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

2

ドキュメントを読むと、コントロールのハンドルがまだ作成されていないときInvokeRequiredに返されることがわかります。ドキュメントには、 beforefalseの値を確認する必要があると記載されています。IsHandleCreated

また、ハンスが上で述べているように、破壊時間にも問題があるため、正しいスレッドでコントロールが既に破棄されているかどうかを確認することをお勧めします。

もう 1 つの方法は、コントロールが完全にロードされたときにバックグラウンド スレッドを開始することですが、これもInvokeIfRequired汎用ツールにはなりません。

于 2013-06-08T17:56:02.303 に答える
0

こんにちはシャー​​ロック http://msdn.microsoft.com/en-us/library/ms171728(v=vs.80).aspx

于 2013-06-08T17:05:52.283 に答える