0

この新しいスレッドはデリゲートを介して作成されているため、どのような理由で 内でthis.InvokeRequired等しいでしょうか?FalseInitUIState()

私の問題は、ラベルが設定されておらず、実行されていないことです。これは=this.BeginInvoke()という事実によるものだと思います。InvokeRequiredFalse

    private delegate void BackgroundOperationDelegate(ViewMode mode);
    private BackgroundOperationDelegate backgroundOperationDelegate;

    private void FormControlPanel_Load(object sender, EventArgs e)
    {
        Init();
    }

    private void Init() {
        this.backgroundOperationDelegate = this.InitUIState;
        this.backgroundOperationDelegate.BeginInvoke(mode, null, null);
    }

    private void InitUIState(ViewMode mode)
    {
        // .. other business logic only here relevant
        // to the worker process ..
        this.BeginInvoke((MethodInvoker)delegate
        {
            this.labelProgramStatus.Text = CONSOLE_IDLE_STATUS;
        });
    }

私はこのパターンを何度も使用していますが、何らかの理由で、今回は実行されていません :P (そしてInitUIState()、デリゲートから呼び出されるインスタンスは 1 つだけです)

みんなありがとう。

2 つの異なるスレッドを検証する画像:
http://imgur.com/mq12Wl&X5R7G
http://imgur.com/mq12W&X5R7Gl

フォローアップの質問:これはスレッドを作成するための好ましくない方法ですか? 私はいつもそれがとてもシンプルで軽量だと思っていました. おそらく私は使用する必要がthread.Start()あり、これらの問題を回避できますか?

4

3 に答える 3

2

2 番目の BeginInvoke は例外をスローします。

試す

private void InitUIState(ViewMode mode)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke((MethodInvoker)delegate
        {
            InitUIState(mode);
        });
    }
    else
    {
        this.labelProgramStatus.Text = CONSOLE_IDLE_STATUS;
    }
}
于 2010-09-02T10:32:25.503 に答える
0

Form と Delegate の BeginInvoke を混在させています。どちらも同じメソッド名を持っているからです。

フォームのメソッドである BeginInvoke は、同じ UI スレッドで要求されたメソッドを呼び出しますが、保留中の独自の UI 操作を処理した後、後の段階で呼び出します。これが、InvokeRequired がフォームの BeginInvoke メソッド内で常に false になる理由です。

Delegate のメソッドである BeginInvoke は、スレッド プール内の新しいスレッドでメソッドを非同期的に呼び出します。また、デリゲートの BeginInvoke の InvokeRequired は常に true になります。

于 2010-09-02T10:01:37.070 に答える
-1

Invokeデリゲートでは、とBeginInvoke同じではありませんISynchronizeInvoke

EndInvokeまた、代理人を扱うときに電話する必要があります。

于 2010-09-02T09:56:23.087 に答える