1

C#でフォームアプリを作成していて、任意のスレッドからリッチテキストボックスの内容を変更できるようにする必要があります。デリゲートInvokeRequiredを使用してみましたが、作成したデリゲートでクロススレッド呼び出しエラーが発生します。 、およびInvokeRequiredは、エラーを発生させることなくフォームをクラッシュさせます。関数私はどのスレッドからでも実行できる必要があります:

    public static void updateSub(int what)
    {
        subDisplay.subBox.Text = tb[what];
    }

私が使おうとしたデリゲート:

    public delegate void UpdateDelegateVoid(int what);
    static public UpdateDelegateVoid uSub = new UpdateDelegateVoid(updateSub);
    uSub(0);

私のInvokeRequiredコード:

    public static void updateSub(int what)
    {
        if (subDisplay.subBox.InvokeRequired)
        {
            subDisplay.subBox.Invoke(new MethodInvoker(finish));
        }
        else
        {
            subDisplay.subBox.Text = tb[what];
        }
    }

上記のコードが機能しない理由はよくわかりません。ありがとう!

4

3 に答える 3

3

厳密に言えば、それを確認InvokeRequiredして見つけたら、同じメソッドtrueの呼び出しをマーシャリングする必要があります。それがあなたの特定の問題を修正するかどうかはわかりませんが(例外の詳細とコードをもっと見る必要があります)、これが私が意味することです:

public static void updateSub(int what)
{
    if (subDisplay.subBox.InvokeRequired)
    {
        subDisplay.subBox.Invoke(new Action<int>(updateSub), what);
    }
    else
    {
        subDisplay.subBox.Text = tb[what];
    }
}

「奇妙な動作」が発生している場合は、フォームが実際にメインアプリケーションスレッドで作成されていることを確認してください。WinFormsでは(WPFの場合のように)これは強制されないため、フォームが作成されたスレッドが実際にはアプリのルートスレッドではない可能性があります。

于 2011-04-28T08:56:09.343 に答える
2

私は主にこれを使用します、そしてそれは完全に機能します。まったく同じ目的のためにあなたが意図しているものです。

public void UpdateSub(string message)
{
    subDisplay.subBox.Invoke((Action)delegate {
        subDisplay.subBox.Text = message;
    });
}

それがあなたや他の誰かに役立つことを願っています!

于 2011-04-28T09:15:32.303 に答える
1

これを試してください-呼び出しが必要な場合に同じメソッドを呼び出します。

public void UpdateSub(string message)
{
    if (!subDisplay.subBox.InvokeRequired)
    {
        subDisplay.subBox.Text = message;
    }
    else
    {
        var d = new UpdateFormText(UpdateSub);
        Invoke(d, new object[] { message });
    }
}

UpdateFormTextがデリゲートである場合

public delegate void UpdateFormText(string message);
于 2011-04-28T08:56:34.233 に答える