0

アニメーションを含む「データを読み込んでいます...」というメッセージが表示されるSilverlight2アプリケーションがあります。Webサービスがデータを返し、データが監視可能なコレクションに読み込まれると、アニメーションがフリーズします(これは、データの読み込み中に数秒間続く可能性があり、何かがおかしいという印象を与えます)。

ビュー内のアイテムコントロールにデータバインドされている監視可能なコレクション。

何が起こっているのかは、データが監視可能なコレクションに追加されているときに、データバインドされたコントロール用にビジュアルツリーが構築されていることだと思います。これはUIスレッドで発生します。

とにかく、UIスレッドで大量のデータ作業が行われている場合でも、UIスレッドでのアニメーションを続行できるように、データ読み込みの優先度を下げることはできますか?

ありがとうマイケル

4

4 に答える 4

1

あなたがこれに対する答えを得たかどうかはわかりませんが、ここに行きます。

BackgroudWorkerを使用して、ヘビーデューティーの指示をそこに入れてみてください。

これは非常に良い例です:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

問題がある場合はお知らせください。すでにこの問題を解決している場合はお知らせください。

于 2009-07-27T20:14:49.880 に答える
0

You're right in saying that the callback happens on the UI thread. To solve your issue you can make it asynchronous so that it happens on a background thread and then build a new observable collection and replace the existing one in one operation. For example:

private SynchronizationContext _uiThread = SynchronizationContext.Current;

public void UpdateUIAsynchronously(ICollection<Data> data)
{
ObservableCollection<Data> temp = new ObservableCollection<Data>();
foreach(Data currentData in data)
{
temp.Add(currentData);
}

_uiThread.Post(delegate(object o) { myDataGrid.ItemsSource = temp }, null);
}

In my development I found that for a DataGrid I could just clear and add the new elements on the UI thread without performance hit. Maybe you could refactor your UI code?

于 2009-07-02T14:35:40.443 に答える
0

状態が不確定な進行状況コントロールを使用していて、それをアイテムコントロールの上に半透明の背景を持つコントロールに配置しました。Webサービスの呼び出しが行われ、戻りオブジェクトがViewModelに処理され、ItemControlが更新されたビューモデルをレンダリングしている間、アニメーションが停止するのを見たことがありません。

プログレスバーテンプレートを非常に簡単な方法でカスタマイズできるだけでなく、LoadingData...メッセージをTextBlockとして追加できると思います。Progressコントロールの上にもLoading...メッセージがあります。

于 2009-06-30T21:31:05.233 に答える
-1

JSが返されたデータを処理しているため、アニメーションは実行されていません。(シングルスレッドブラウザ。)

解決策:ブラウザがアニメーションを実行できるようにするには、JSローディングソフトウェアが定期的にブラウザに譲る必要があります。

私のSOの答えを参照してくださいなぜjQueryAjaxはIE7でとても遅いのですか?それを行う方法の詳細については。

于 2009-06-30T03:45:37.900 に答える