を使用している場合。クロススレッド操作ではない、私はそれに私のカスタムコントロールを持つフォームを持っていてもInvokeRequired
私は私のフォームでの方法があります。
private void SetEnabledOnControls(bool val)
{
if (InvokeRequired)
{
Invoke((Action<bool>)SetEnabledOnControls, val);
}
else
{
//do the work - iterate over child controls,
//and they iterate over their children, etc...
}
}
をそして私が述べた例外を取得else
枝上にあるメソッド内:
Cross-thread operation not valid: Control 'txtNumber' accessed from a thread other than the thread it was created on.
私のシナリオでは、実際にはもう少し複雑です - これを例として外挿しました。実際に何が起こっているのは、私はWorkflowFoundationを使用しているということである - 私は(それ自身のスレッドで実行)WorkflowApplicationで実行されているStateMachineActivity(CTP1)を持って、私はそれのイベントにサブスクライブし、そこから私はSetEnabledOnControls
を呼んでいます。また、ブックマークを使用してワークフローを再開しています(また、サイドにMEFがあり、シナリオには関係しません)。それはInvokeRequiredがfalseの場合、私はクロススレッドの例外を持っている可能性があるか -
ことのすべては、InvokeRequiredの私の明白な誤解とは無関係ですか?私は、「手動で」コントロールを作成しません。デザイナが配置したInitialize()にすべてがあります。
誰もがこれにいくつかの光を当てることができますか?
ありがとうございます!
EDIT GWLlosaの提案を使用して、私はSystem.Threading.Thread.CurrentThread.ManagedThreadId
を使用してスレッドIDを追跡してきました。今や奇妙な部分があります... Initialize()のスレッドIDは10です。最初の2つの状態を渡す間に、Id 13 - InvokeRequiredがtrueになり、正しく呼び出されます。しかし、2番目の状態の後、SetEnabledOnControls
と入力すると再び13になりますが、今回InvokeRequiredはfalseです。どうして!?後で、もちろん、子コントロールを変更することはできません(驚くことではありません)。フォームが何とかそれが住んでいるスレッドを変更したことがありますか?
EDIT 2 今、私が呼んでいる:
if (IsHandleCreated)
{
Invoke((Action<bool>)SetEnabledOnControls, val);
}
、それがtrueにIsHandleCreated
を持っているが、それでもpointed atをdevSpeed何で失敗します。
EDIT 3 手のひらを顔に当てる :)状態を再開したボタンの一つは、フォームの最初のCancelButtonでした。それはのようなプロパティから削除された場合には、codebihindはまだ=それのためにキャンセルDialogResultを持っていた - ので、私のフォームが実際に閉じられ、InvokeRequiredが正しい情報を返しませんでしたので、もちろん、それはハンドルがありませんでした、ので、エラー。
ありがとうございました!今日は新しいことを学んだ:)
実際に私はそれを最後に実行しました...有用なリンク;) – veljkoz