最初のトピックは、InvokeRequied の何が問題なのかです。
彼が私に勧めてくれたという答えに従ったのですが、新たな問題が見つかりました。
下の図の結果は、クロス スレッド例外です。
私のコードの何が問題になっていますか?
この問題を解決するには?
最初のトピックは、InvokeRequied の何が問題なのかです。
彼が私に勧めてくれたという答えに従ったのですが、新たな問題が見つかりました。
下の図の結果は、クロス スレッド例外です。
私のコードの何が問題になっていますか?
この問題を解決するには?
MSDN によると、本来あるべき場合、つまり、そのコントロール/フォーム (またはその親) が作成される前にアクセスした場合でも、InvokeRequired
返すことができます。false
InvokeRequired
true
InvokeRequired
Handle
基本的に、チェックは不完全であり、表示される結果につながります。
確認する必要がありますIsHandleCreated
-そうであれば、何が返されるかに関係なく/false
を使用する必要があります。Invoke
BeginInvoke
InvokeRequired
[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!" );
}
[アップデート]
したがって、この問題を回避するには、次のことが重要です。
Handle
UI スレッド以外のスレッドで最初にアクセスする前に、 が既に作成されていることを常に確認してください。
MSDNによると、UI スレッドで参照して強制的に作成する必要があるだけですcontrol.Handle
。コードでは、UI スレッドではないスレッドからそのコントロール/フォームに初めてアクセスする前に、これを行う必要があります。
[/アップデート]