0

簡単なアプリケーションは CF 2.0 で書かれています。私に関する限り、それはシングルスレッドです。

アプリケーションの 2 つの部分が重要です。PDA のバーコード スキャナー (メーカー提供) を表すクラスによって発生した "バーコード スキャン" イベントを処理するイベント ハンドラーと、30 秒ごとに実行される Windows.Forms.Timer のイベント ハンドラーです。

最近、アプリケーションがバグに悩まされていました。私が見ることができる唯一の理由は、Timer_Tick イベントの途中で Barcode Scanned イベントを処理していることです。これは不可能であり、最初のイベントが完全に処理されるまで、イベントの 1 つがキューで待機することは確実でした。MSDN の Windows.Forms.Timer ページも、それが通常のシングルスレッド タイマーであることを保証します。Barcode Scanned によってトリガーされたコードは、インターフェースの一部を変更しますが、例外は発生しません。そのため、シングルスレッドでもあると想定しています。いいえ、DoEvents などは使用していません。

そのような再入可能性は不可能であり、他の考えられる理由をもっと詳しく調べる必要がある、またはその逆で、彼らが同じ問題に苦しんでいると確信できる人はいますか?

4

2 に答える 2

1

Windows.Formsタイマーは、PostMessageの呼び出しを介してUIスレッドで発生します。それは保証です。「スキャンされたバーコード」がどのように機能するかは、イベントを提供しているライブラリの開発者次第です。特に強制しない限り( Control.Invokeの呼び出しを介して)、タイマーと同じコンテキストで実行されると想定しないでくださいそれでも、コールオーダーを保証できるとは思いません。

再入可能性が原因である可能性があると思われる場合、解決策は比較的単純です。両方のハンドラー(タイマープロシージャとイベント)でモニターを使用し、同じオブジェクトをロックします。これにより、再入可能性の問題である可能性が排除されます。問題が解決した場合は、原因がわかっており、すでに修正されています。問題が解決しない場合は、それが再入可能ではないことを確実に知っており、他の場所に集中することができます。

于 2008-12-17T02:07:57.400 に答える
0

私が使用したほとんどすべてのバーコード スキャン コンポーネントは、バックグラウンド スレッドから実行されるので、それをもっと詳しく調べます。

于 2008-12-19T20:33:59.957 に答える