私はインターフェイスをフリーズしているc#.NETマルチスレッドアプリケーションがあります。私がシステムをアイドル状態にしてからスクリーンセーバーを起動させないと、インターフェイスがフリーズしない(システムにアクセスするためにパスワードを再入力する必要がある)というのは珍しいことです。インターフェイスが再び表示されると(パスワードを正常に入力した後)、インターフェイスはロックされます。私がスクリーンセーバーを始動させない限り、インターフェースはロックアップしません。マルチスレッドのC#アプリケーションでインターフェイスがフリーズする
私は、同じDLLにアクセスする2つの異なる実行可能ファイルがあり、DLLにアクセスするためにどのアプリケーションを使用してもこの問題が発生していることを指摘しておきます。これは、DLLに関連する方法とは別に、2つのアプリケーションが完全に異なっている(C++/MFC)と(C#/ .NET)という問題がDLLにあることを暗示しているようです。
両方のexeは、DLLとのやり取りにおいて同様の手順を実行します。彼らはシリアルポートの通信をセットアップするためのDLLへの呼び出しを行い、DLLのステータスウィンドウを開き、DLLのスレッドを開始して通信ポートを監視し、dllのスタックを監視するメインアプリでスレッドを開始します。
データがcommポートからDLLのスレッドによって取得されると、解析され、結果がスタックに配置され、デリゲートを介してステータスウィンドウにポストされます。 exe内のスレッドがスタック内のデータを見ると、デリゲートを使用してメインウィンドウにデータを出力します。
DLL内のスレッドにコードを追加してApplication.DoEvents()を30秒ごとに呼び出すと、インターフェイスが約30秒間フリーズして通常のように再開することが判明しました。 何かがメインスレッドをブロックしているとわかり、DoEvents()が強制的にロックを解除するように見えますが、何が原因でこのロックが解除されたのかはわかりません。
この問題は、開発マシンとテストマシンの両方で発生します。
私は、DLL内のステータスウィンドウにデータの出力を完全に削除しようとしましたが、違いはありませんでした。
私は長年にわたってマルチスレッドプログラミングを行ってきましたが、このようなことはまったくありませんでした。どんなアドバイスも大歓迎です。
ありがとうございました。
デバッガでフリーズしたUIを一時停止し、コールスタックを確認します。 – SLaks
DLLメソッドをUI以外のスレッドからのみ呼び出し、UIスレッドにマーシャリングしてみましたか? – RobS
これは完全に役立つわけではないかもしれませんが、スクリーンセーバーが起動したときに起こる省電力スイッチがありますか? (ポートがスリープ状態になるかもしれないと思っています) – vlad259