2012-04-02 5 views
0

私のアプリには2種類のスレッドがあります - UI(正確に1インスタンス)と非UI(複数)です。 UIスレッドがApplication.DoEventsを実行するときに、アプリケーションがControl.Invokeでハングするシナリオがあります。Invokeはх64モードでWinformsアプリケーションをハングアップし、x32では非常にまれです

私は強調します - UIスレッドは常にメッセージポンプを実行します。私は

  • (ポスト)BeginInvokeメソッドが正常に動作
  • 子コントロール、MainFormを経由して起動しない呼び出す場合はBeginInvokeメソッドは、私がAsyncWaitHandle.WaitOne(送信)を追加するとき
  • すべてが下に正常に動作ハング良く作業

    1. の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); 
         })); 
    
  • +3

    まあ、DoEvents関数を使用しないと、UIスレッド上でWAITONEを呼び出すことはありませんすることができます。そこから取り出してください。 –

    +0

    私はUIスレッドでいくつかの操作を実行する必要があるので、私は使用する必要があります。問題は、Invokeの指定された呼び出しだけがアプリケーションをハングアップし、残りの部分は正常に動作することです。 –

    +0

    デザインを改訂してください。貼り付けたコードは、完全な画像がどのように「醜い」かを示していませんが、適切なデザインを使用しない限り、ハングを簡単に回避することはできません。さらに、.NETバグを被ったすべてのケースを考慮しないでください。ほとんどの場合、高度なレベルのコードを書く必要があります。 –

    答えて

    0

    古い質問が、私はこの今日直面しています。 非常にまれに起こるので、私はそれを再現しません。しかし、私は動作するように見える解決策を見つけました。

    private delegate void ArticleListThreadHandler(); 
    private void OnOrderArticleSyncFinished() 
        { 
         //if (this.InvokeRequired) 
         //{ 
         // IAsyncResult result = BeginInvoke(new ArticleListThreadHandler(OnOrderArticleSyncFinished)); 
         // result.AsyncWaitHandle.WaitOne(); 
         //} 
         if (InvokeRequired) 
         { 
          ThreadStart myMethod = delegate { OnOrderArticleSyncFinished(); }; 
          this.BeginInvoke(myMethod); 
          return; 
         } 
         else 
          PopulateArticleList(); 
        } 
    

    私がコメントアウトしたコードは、時には呼び出しスレッドをハングさせました。私はそれを非コメントのコードに変更しても、私はもう問題に遭遇していません。

    このコードに見えるだけで、常に別のスレッドから呼び出されたときにハングアップする...そしてません:/

    これは、私はバグが発生しているアプリケーションを閉じたときに私が取得エラーです。

    System.Threading.ThreadAbortException:スレッドが中止されました。 System.Threading.WaitHandle.WaitOneでSystem.Threading.WaitHandle.WaitOneでSystem.Threading.WaitHandle.WaitOneNative(SafeWaitHandle waitHandle、UInt32型millisecondsTimeout、ブールhasThreadAffinity、ブールexitContext) (Int64のタイムアウト、ブールexitContext) (のInt32 millisecondsTimeoutで XYZでxyz.ServiceEdition.Modules.Article.ArticleModule.SyncFinishedEventHandler.Invoke() でxyz.ServiceEdition.Modules.Article.ArticleList.OnOrderArticleSyncFinished() でSystem.Threading.WaitHandle.WaitOne() で、ブールexitContext) .ServiceEdition.Modules.Article.ArticleModule.OnSyncFinished() at xyz.Modules.SyncModule。xyz.Modules.SyncModule.MobileSyncModule.SendSyncFinishedでSyncStateDelegate.Invoke() ()

    がうまくいけば、これは誰か:)

    関連する問題