2011-01-19 19 views
4

私は.NET 2.0のC#WinFormsアプリケーションを開発中に正常に動作しますが、時にはプロダクションでフリーズします。
1.私はInvokeRequiredとInvokeを使用して、UIコンポーネントが間違ったスレッドから操作されていないことを確認しました。
2. UIスレッドですべてのタイマーオブジェクトを同期しました。
3. OnUserPreferenceChangedについてこの記事http://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.htmlを読んだところ、この問題がありましたが、修正しました。私のC#WinFormsアプリケーションをフリーズ/ハングさせる原因となっている愚かなエラーですか?

これは、.NET 1.1から.Net 2+に移行したときに起きたことです。その前に、それは決して掛からない。

私はマネージドスタックエクスプローラを使用して、この問題が発生し、メインのUIスレッドが常に新しいランダムな場所にスタックされている場合、運用アプリケーションからスタックトレースを定期的に取得しています。これがスレッドデッドロックの場合には、WaitOneでブロックされません。

私のアプリケーションは次のことを行います。
- 複数のSystem.Timers.Timerインスタンスを使用します。
- WMIを使用して印刷を管理します。
- Webサービスをサーバーに呼び出すが、UIとやり取りしないバックグラウンドスレッドがいくつかあります。
- System.Diagnostics.Processを使用してコンピュータ上の他のプロセスを調べ、時にはそれらを強制終了するバックグラウンドスレッドをいくつか持っています。
- シリアルポートを使用して請求書受領者と通話する第三者dllと対話します。
- いくつかのcom/activex/ocxコントロールと相互作用して、クレジットカードリーダーとやりとりします。

は、ここで1時間の一例は、それがハングアップしてい時点で、すべてのスタックトレース:私は何をするべきで

Thread ID: 2816 
    0. System.Threading.WaitHandle.WaitOne (Source Unavailable) 
    1. System.Threading.WaitHandle.WaitOne (Source Unavailable) 
    2. System.Threading.WaitHandle.WaitOne (Source Unavailable) 
    3. System.Management.MTAHelper.WorkerThread (Source Unavailable) 
    4. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable) 
    5. System.Threading.ExecutionContext.Run (Source Unavailable) 
    6. System.Threading.ThreadHelper.ThreadStart (Source Unavailable) 

Thread ID: 2828 

Thread ID: 2852 
    0. MeiNet.EBDS.BillAcceptor.submitRequestStack (Source Unavailable) 
    1. MeiNet.EBDS.BillAcceptor.OnHandleEscrowed (Source Unavailable) 
    2. MeiNet.EBDS.BillAcceptor.EventHandler (Source Unavailable) 

Thread ID: 2908 

Thread ID: 2820 
    0. System.Threading.Thread.Sleep (Source Unavailable) 
    1. MyApp.ProcessKiller.startSpecialKillerLoop (ProcessKiller.cs:115) 
    2. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable) 
    3. System.Threading.ExecutionContext.Run (Source Unavailable) 
    4. System.Threading.ThreadHelper.ThreadStart (Source Unavailable) 

Thread ID: 2600 

Thread ID: 2844 
    0. System.Threading.Thread.Start (Source Unavailable) 
    1. System.Net.TimerThread.Prod (Source Unavailable) 
    2. System.Net.TimerThread.TimerQueue.CreateTimer (Source Unavailable) 
    3. System.Net.ServicePoint..ctor (Source Unavailable) 
    4. System.Net.ServicePointManager.FindServicePointHelper (Source Unavailable) 
    5. System.Net.ServicePointManager.FindServicePoint (Source Unavailable) 
    6. System.Net.HttpWebRequest.FindServicePoint (Source Unavailable) 
    7. System.Net.HttpWebRequest.GetRequestStream (Source Unavailable) 
    8. System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke (Source Unavailable) 
    9. MyApp.MyServer.Server.hb4 (Reference.cs:588) 
    10. MyApp.HeartbeatSender.SendThreadedHeartbeat (HeartbeatSender.cs:81) 
    11. MyApp.HeartbeatSender.StartHeartbeatLoop (HeartbeatSender.cs:40) 
    12. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable) 
    13. System.Threading.ExecutionContext.Run (Source Unavailable) 
    14. System.Threading.ThreadHelper.ThreadStart (Source Unavailable) 

Thread ID: 2824 
    0. System.Threading.Thread.Sleep (Source Unavailable) 
    1. MyApp.OfficeMonitor.StartMonitoring (OfficeMonitor.cs:84) 
    2. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable) 
    3. System.Threading.ExecutionContext.Run (Source Unavailable) 
    4. System.Threading.ThreadHelper.ThreadStart (Source Unavailable) 

Thread ID: 2584 
    0. [Internal thisFrame, 'M-->U', System.Windows.Forms.UnsafeNativeMethods::GetModuleHandle] (Source Unavailable) 
    1. System.Windows.Forms.Application.get_ComCtlSupportsVisualStyles (Source Unavailable) 
    2. System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintWorker (Source Unavailable) 
    3. System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintUp (Source Unavailable) 
    4. System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintOver (Source Unavailable) 
    5. System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.Paint (Source Unavailable) 
    6. System.Windows.Forms.ButtonBase.OnPaint (Source Unavailable) 
    7. System.Windows.Forms.Control.PaintWithErrorHandling (Source Unavailable) 
    8. System.Windows.Forms.Control.WmPaint (Source Unavailable) 
    9. System.Windows.Forms.Control.WndProc (Source Unavailable) 
    10. System.Windows.Forms.ButtonBase.WndProc (Source Unavailable) 
    11. System.Windows.Forms.Button.WndProc (Source Unavailable) 
    12. System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Source Unavailable) 
    13. System.Windows.Forms.Control.ControlNativeWindow.WndProc (Source Unavailable) 
    14. System.Windows.Forms.NativeWindow.Callback (Source Unavailable) 
    15. [Internal thisFrame, 'M-->U', System.Windows.Forms.SafeNativeMethods::UpdateWindow] (Source Unavailable) 
    16. System.Windows.Forms.Control.Update (Source Unavailable) 
    17. System.Windows.Forms.Control.Refresh (Source Unavailable) 
    18. MyApp.MainForm.ClearFields (MainForm.cs:4057) 
    19. MyApp.MainForm.ShowHomeButtons (MainForm.cs:5664) 
    20. MyApp.MainForm.ShowScreenSaver (MainForm.cs:4284) 
    21. MyApp.MainForm.ScreensaverTimerTick (MainForm.cs:7817) 
    22. System.RuntimeMethodHandle.InvokeMethodFast (Source Unavailable) 
    23. System.Reflection.RuntimeMethodInfo.Invoke (Source Unavailable) 
    24. System.Delegate.DynamicInvokeImpl (Source Unavailable) 
    25. System.Windows.Forms.Control.InvokeMarshaledCallbackDo (Source Unavailable) 
    26. System.Windows.Forms.Control.InvokeMarshaledCallbackHelper (Source Unavailable) 
    27. System.Threading.ExecutionContext.runTryCode (Source Unavailable) 
    28. System.Threading.ExecutionContext.RunInternal (Source Unavailable) 
    29. System.Threading.ExecutionContext.Run (Source Unavailable) 
    30. System.Windows.Forms.Control.InvokeMarshaledCallback (Source Unavailable) 
    31. System.Windows.Forms.Control.InvokeMarshaledCallbacks (Source Unavailable) 
    32. System.Windows.Forms.Control.WndProc (Source Unavailable) 
    33. System.Windows.Forms.ScrollableControl.WndProc (Source Unavailable) 
    34. System.Windows.Forms.ContainerControl.WndProc (Source Unavailable) 
    35. System.Windows.Forms.Form.WndProc (Source Unavailable) 
    36. System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Source Unavailable) 
    37. System.Windows.Forms.Control.ControlNativeWindow.WndProc (Source Unavailable) 
    38. System.Windows.Forms.NativeWindow.Callback (Source Unavailable) 
    39. [Internal thisFrame, 'M-->U', System.Windows.Forms.UnsafeNativeMethods::DispatchMessageW] (Source Unavailable) 
    40. System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Source Unavailable) 
    41. System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (Source Unavailable) 
    42. System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Source Unavailable) 
    43. System.Windows.Forms.Application.Run (Source Unavailable) 
    44. MyApp.MainForm.Main (MainForm.cs:2975) 

任意の提案ですか?

+0

ハングアップすると、ユーザーインターフェイスが応答しなくなったことを意味しますか?または、いくつかのエラーメッセージが表示されますか? – CodingBarfield

+1

@Nobody私は誰もあなたに、あなたが特にSOの範囲外のコードのすべてを見ずにハングアップする原因について何かアドバイスを与えることはできないと考えています。 – msarchet

+1

あなたが何かを待つよう指示したときに、デッドロックが発生するだけではありません。何かをロックしていて、別のスレッドがロックしようとすると、デッドロックが発生する可能性があります。メソッドがまだ初期化されていないものに依存し、ロックが必要な場合、デッドロックが発生する可能性があります。スレッドなどを使うときには注意してください。 – Crisfole

答えて

2

いくつかの考え:

  • 本番に存在しない開発環境で任意のプリプロセッサフ​​ラグを使用しています。したがって、#If Debugなどです。

  • リリースモードで開発環境をテストしましたか?まだハングアップしていませんか?

  • 機械の違いは何ですか?クアッドコアとデュアルコアの2種類のRAMは、百万のファイアウォールの後ろに1つずつありますが、もう1つはありませんか?

  • あなたのUI要素を更新する前に、何らかのコールバックが完了するのを待っていることはありませんか?

  • データベースを使用していますか?もしそうなら、彼らは違っていて、どう違うのですか?

  • あなたがStackTracesを引っ張っているという事実のために掛かっているのでしょうか?

  • 何が起こっているかを伝えるかもしれないどこにでも飲み込んでいるという例外はありますか?

  • マシンのシリアルポートについては何か違いはありますか?

  • 同じ紙幣レセプタが使用されていますか?

続きを続けるなど。

これを新しいVMにインストールして、何が起こるかを確認してください。それはいくつかの古いdllまたはドライバ、多くの場合Works on my machineの症状が起こったときにあなたがそれを作ったことを忘れてしまったことがあったためです。

+0

提案していただきありがとうございます。クイック回答:フラグなし、異なるモードなし、コールバック待ちのスレッドなし、データベースなし、この問題が発生するまでスタックトレースを取得しなかった、すべての例外を記録する、シリアルポートを確認する、アクセプタをチェックします。これについて考えてくれてありがとう。 – Category6

0

私は、1つのスレッドがApplication.get_ComCtlSupportsVisualStylesの呼び出しを行っていたのと同じように見えるハングを見ました。

ビジュアルスタイルを有効にしているのだろうか? http://ryanfarley.com/blog/archive/2004/05/05/599.aspxには、コードまたはマニフェストファイルのいずれかを使用して行う方法が説明されています。

OSがテーマをサポートしていると仮定すると(私はこの機能がXPで始まったと思う)、Application.get_ComCtlSupportsVisualStylesは次のようにはほとんど必要ありません多くの仕事があり、すぐに真実に戻ることができます。

私はまだ、なぜGetModuleHandle()の呼び出しがハングするのか分かりません。私がWeb上で見つけたことのほとんどは、.NET Winフォームペイントイベント中ではなく、LoadLibrary()中に問題があることを示しています。あなたがLoadLibrary()で安全でない作業を同時に行っている別のスレッドを持っているのかどうかわかりません...?

1

我々は正確に同じ問題を抱えていたし、この記事では、(あなたが言及したように)を溶液に私たちを指摘: http://www.ikriv.com/dev/dotnet/MysteriousHang.html#WhatToDo

私たちは、次のコードでスプラッシュ画面を使用:

ThreadPool.QueueUserWorkItem((x) => 
{ 
    using (var splashForm = new SplashForm()) 
    { 
     splashForm.Show(); 
     while (!done) 
      Application.DoEvents(); 
     splashForm.Close(); 
    } 
}); 

私たちは持っていました私たちはデッドロックを再現できる運があります。ラップトップ/タブレットでは、タブレットのみを使用できるようにキーボードから画面を切り離すことができます。私たちが画面を切り離すたびに、私たちのアプリケーションはハングアップしました。スプラッシュを取り除いた後、私たちの問題はなくなりました。

我々は道によって吊りプログラムからまったく同じスタックトレースを持っていた:

System.Threading.WaitHandle.WaitOne (Source Unavailable) 
1. System.Threading.WaitHandle.WaitOne (Source Unavailable) 
2. System.Threading.WaitHandle.WaitOne (Source Unavailable) 
3. System.Management.MTAHelper.WorkerThread (Source Unavailable) 
4. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable) 
5. System.Threading.ExecutionContext.Run (Source Unavailable) 
6. System.Threading.ThreadHelper.ThreadStart (Source Unavailable) 

Offcourseあなたの問題が同じ原因/解決策を持っている場合、私は知らない...しかし、これは私たちのためにそれをやりました。