3

最初のトピックは、InvokeRequied の何が問題なのかです。

彼が私に勧めてくれたという答えに従ったのですが、新たな問題が見つかりました。

下の図の結果は、クロス スレッド例外です。

私のコードの何が問題になっていますか?

この問題を解決するには?

ここに画像の説明を入力

4

1 に答える 1

10

MSDN によると、本来あるべき場合、つまり、そのコントロール/フォーム (またはその親) が作成される前にアクセスした場合でも、InvokeRequired返すことができます。falseInvokeRequiredtrueInvokeRequiredHandle

基本的に、チェックは不完全であり、表示される結果につながります。

確認する必要がありますIsHandleCreated-そうであれば、何が返されるかに関係なく/falseを使用する必要があります。InvokeBeginInvokeInvokeRequired

[UPDATE] BUT : これは通常、堅牢に機能しませんInvoke/魔法を実行するためにBeginInvoke作成されたスレッドを確認する... [/UPDATE]Handle

IsHandleCreated返されるものにtrue基づいて行動する場合のみInvokeRequired- 次の行に沿った何か:

if (control.IsHandleCreated)
{
    if (control.InvokeRequired)
    {
        control.BeginInvoke(action);
    }
    else
    {
        action.Invoke();
    }
}
else 
{ 
    // in this case InvokeRequired might lie - you need to make sure that this never happens! 
    throw new Exception ( "Somehow Handle has not yet been created on the UI thread!" );
}

[アップデート]

したがって、この問題を回避するには、次のことが重要です。

HandleUI スレッド以外のスレッドで最初にアクセスする前に、 が既に作成されていることを常に確認してください。

MSDNによると、UI スレッドで参照して強制的に作成する必要があるだけですcontrol.Handle。コードでは、UI スレッドではないスレッドからそのコントロール/フォームに初めてアクセスする前に、これを行う必要があります。

[/アップデート]

于 2012-01-20T19:17:16.237 に答える