0

サードパーティのDLLを介して接続されたデバイスにアクセスするWindowsMo​​bileプログラムがあります。デバイスへの各呼び出しには不明な時間がかかる可能性があるため、各呼び出しにはタイムアウトプロパティが含まれています。呼び出しが戻るのに指定されたタイムアウトよりも長くかかる場合、DLLは代わりに例外をスローし、アプリは問題なくキャッチします。

私が抱えている問題は、アプリケーションを閉じることです。アプリケーションがDLLを呼び出し、タイムアウトが発生するのを待っていて、タイムアウトが発生する前にアプリケーションを閉じると、アプリケーションがロックされ、PDAを再起動する必要があります。

通常の状態では、アプリケーションが閉じる前にタイムアウトを待機することを確認できます。ただし、AppDomain.CurrentDomain.UnhandledExceptionプログラムで未処理の例外をキャッチし、イベントを使用してこの保留中のタイムアウトが発生するのを待機し、プログラムを最終的に閉じることができるようにしようとしています。

私の問題は、このイベントが十分に長く続いていないように見えることです。イベントに行を入れてMessageBox.Show("unhandled exception");、アプリケーションのメインフォームから新しい未処理の例外をスローすると、メッセージボックスが一瞬表示されますが、[OK]ボタンをクリックしないとメッセージボックスが消えます。

このイベントで私が見つけたドキュメントによると、アプリケーションが呼び出されるまでに、アプリケーションは完全にクローズにコミットされ、クローズを停止することはできませんが、イベントメソッド自体が終了しないという意味ではないと思いました。何が得られますか(それが問題だと思います)?

更新: フルウィンドウ(Vista)では、これは期待どおりに機能しApplication.ThreadExceptionますが、.NetCF2.0には存在しないイベントを使用する場合に限ります。

4

1 に答える 1

3

私もこの問題に遭遇しました。これは.NETCF(v2.0)の既知の問題ですが、v3.5の使用中にも発生しました(ただし、発生する状況はより具体的です)。(古くてまだアクティブな)バグレポートはここにあります

MessageBox.Show()を呼び出すとすぐに閉じますが、私の場合は2つの回避策があります。1)MessageBox.Show()をもう一度呼び出します。その後、ユーザーが閉じるまでブロックします。DialogResultをチェックすることにより、最初のMessageBox.Show()が途中で閉じられたことをチェックできます。失敗したときに正確にどの結果が返されたかは覚えていません。デフォルト以外の結果が得られたことを覚えています。

2)カスタムフォームを作成し、その上でShowDialog()を呼び出します。それは私にとってはうまくいきましたが、他の人はそれがうまくいかないと報告しました。Show()を呼び出して、自分自身をブロックすることもできます(Application.DoEvents()を呼び出すことを忘れないでください。そうすれば、イベントの処理が継続されます)。

于 2010-04-19T07:56:07.767 に答える