私のアプリには2種類のスレッドがあります - UI(正確に1インスタンス)と非UI(複数)です。 UIスレッドがApplication.DoEventsを実行するときに、アプリケーションがControl.Invokeでハングするシナリオがあります。Invokeはх64モードでWinformsアプリケーションをハングアップし、x32では非常にまれです
私は強調します - UIスレッドは常にメッセージポンプを実行します。私は
- のAppリモートデスクトップ(原文のまま!)
はTのx64よりもはるかに良い作品х32
Winformsから独立した優れたディスパッチャはありますか?
UPD: x32バージョンはほとんどめったに掛かりません。 x64は頻繁に掛かってしまい、定期的にハングアップするシナリオは1つしかありません。 と私が言ったように、RDPの下でアプリは優れた作品!
UPD2:どちらも起動もBeginInvokeメソッドが
P.S.を使用しているとき デリゲートが呼び出されませんそこ接続mictrosoftのバグはあるが、それはて、myAppからのコードの固定 http://connect.microsoft.com/VisualStudio/feedback/details/97166/control-invoke-hangs
ワンピースとしてマーク:
//UI-thread while (!m_longOperationContext.FinishEvent.WaitOne(100, false)) { System.Windows.Forms.Application.DoEvents(); Trace.WriteLine("Waiting..."); // this I see in the output } //non-UI thread ctrl.Invoke(new Action(() => // this call sometimes hangs despite the UI-thread always executes message pump { SomeOperation(ctrl); }));
まあ、DoEvents関数を使用しないと、UIスレッド上でWAITONEを呼び出すことはありませんすることができます。そこから取り出してください。 –
私はUIスレッドでいくつかの操作を実行する必要があるので、私は使用する必要があります。問題は、Invokeの指定された呼び出しだけがアプリケーションをハングアップし、残りの部分は正常に動作することです。 –
デザインを改訂してください。貼り付けたコードは、完全な画像がどのように「醜い」かを示していませんが、適切なデザインを使用しない限り、ハングを簡単に回避することはできません。さらに、.NETバグを被ったすべてのケースを考慮しないでください。ほとんどの場合、高度なレベルのコードを書く必要があります。 –