ナビゲーション ベースの WPF アプリケーションがあります。Visual Studio から直接実行する場合、またはファイルを別のディレクトリまたは別のコンピューターにコピーしてそこで実行する場合でも、問題なく動作します。
ClickOnce を使用してインターネット経由でアプリケーションを展開しますが、ほとんどの場合、これで問題は発生しません。
ただし、ときどき完全にフリーズし、古典的な「アプリケーション xxxx が応答していません」というメッセージが表示され、UI が応答しなくなります。
これは毎回発生するわけではなく、デプロイされたバージョンを使用している場合にのみ発生します。(開発マシンでこれをテストしても)。
このメッセージを入力している間、動作を再現するためにデプロイされたバージョンを何度も開始および終了しています... 10 回連続して発生することもあれば、次の 20 回は正常に動作することもあります。何が原因であるかについての兆候はありません。(実現に成功しただけ)
私が何を意味するかを示すために、ここにスクリーンショットがあります:
[ ][ヌル]
これは、ListBox の最初の項目をダブルクリックしたときに発生しました。
LLCOverviewPage llcOverview = new LLCOverviewPage((Controller)this.lstControllers.SelectedItem);
this.NavigationService.Navigate(llcOverview);
アプリケーションは永遠にこの状態のままで、例外はスローされません。
LLCOverViewPage のコンストラクタは次のようになります。
public LLCOverviewPage(Controller CurrentController)
{
InitializeComponent();
this.currentController = CurrentController.ToLightLinkController();
this.updateControllerInfo();
}
updateControllerInfo() メソッドは、ページに情報を表示し、SQL Compact 3.5 データベースから以前にロードされたより多くの情報をメソッドを呼び出します。
private void updateControllerInfo()
{
//Update the UI with general properties
this.lblDeviceName.Content = this.currentController.ShortName;
this.lblEthernetAddress.Content = this.currentController.Eth0.EthernetAddress.ToString();
this.lblTcpPort.Content = this.currentController.Eth0.TcpPort.ToString();
this.lblActuatorThroughputMode.Content = (this.currentController.Dali.ActuatorThroughputMode ? "Enabled" : "Disabled");
this.lblNetmask.Content = (this.currentController.Eth0.Netmask != null ? this.currentController.Eth0.Netmask.ToString() : String.Empty);
this.lblDefaultGateway.Content = (this.currentController.Eth0.DefaultGateway != null ? this.currentController.Eth0.DefaultGateway.ToString() : String.Empty);
//Update the UI with the ballasts
this.updateBallastList();
}
private void updateBallastList()
{
this.lstBallasts.ItemsSource = null;
List<BallastListViewItem> listviewItems = new List<BallastListViewItem>();
foreach (DaliBallast ballast in this.currentController.Dali.Ballasts.OrderBy(b => b.ShortAddress))
{
listviewItems.Add(new BallastListViewItem(ballast,this.currentController.SerialNumber));
}
this.lstBallasts.ItemsSource = listviewItems;
}
それはそれについてです。ページが構築されるとき、他に何も起こりません。
例外なく、アプリケーションがクラッシュしないため、何が問題なのかを突き止めるために私が行うことはほとんどありません。
SQL Compact データベースはユーザーのアプリケーション フォルダーに格納されるため、デプロイされたバージョンは通常のバージョンと同じデータベースを使用し、違いはありません。
したがって、明確にするために、この問題はデプロイされたバージョンでのみ発生します! (Windows XP と Windows Vista の両方を搭載した異なるマシンでテスト済み)
このようなことが発生する原因、またはこの問題を追跡するために私が試みる可能性のあるアイデアはありますか?
アップデート
古き良きデバッグ(ログ情報をファイルに書き込む)を使用して、すべてのコードが正常に実行され、その後アプリケーションがフリーズするだけであると判断できました。
したがって、作成中のページのコンストラクターをもう一度見てみると、次のようになります。
public LLCOverviewPage(Controller CurrentController)
{
InitializeComponent();
this.currentController = CurrentController.ToLightLinkController();
this.updateControllerInfo();
}
this.updateControllerInfo() の後、アプリケーションが時々フリーズします。これは私のコードを超えたものでしょうか? おそらくWPFのバグですか?
更新 2 Windows で Application EventLog を確認したところ、次のように表示されました。
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Application Hang" />
<EventID Qualifiers="0">1002</EventID>
<Level>2</Level>
<Task>101</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2008-11-04T15:55:55.000Z" />
<EventRecordID>1630</EventRecordID>
<Channel>Application</Channel>
<Computer>DEVTOP</Computer>
<Security />
</System>
<EventData>
<Data>LLCControl.exe</Data>
<Data>1.0.0.0</Data>
<Data>2f4</Data>
<Data>01c93e95c29f9da5</Data>
<Data>20</Data>
<Binary>55006E006B006E006F0077006E0000000000</Binary>
</EventData>
</Event>
バイナリ テキストには次のように書かれています。
UPDATE 3 リストボックスのイベントハンドラーコードを次のように変更すると:
LLCOverviewPage llcOverview = new LLCOverviewPage((Controller)this.lstControllers.SelectedItem);
MessageBox.Show("Navigating Now");
this.NavigationService.Navigate(llcOverview)
ナビゲート中にのみアプリケーションがフリーズすることがわかりました。
更新 4 いくつかのイベント ハンドラーを NavigationService に接続しました。イベントがトリガーされると、ハンドラーは単にログに書き込みます。結果は次のようになります。
17:51:35 ナビゲート中 17:51:35 ナビゲート済み 17:51:35 LoadCompleted
では、なぜこれが忘却に向かうのでしょうか。