2017-02-01 4 views
1

現在の操作を表示するソートアプリケーションを作成する必要があります。
私はそのようにしました:UIの反応を伴うバックグラウンドでの操作

私はintのコレクションを持っています。その中には、ソートアルゴリズムとイベント「ステップ」があり、2つの引数 '操作'が必要です。私は何かをする要素のint[]を比較、並べ替えなど。

並べ替えが特定の項目で何かを行っている場合は、ListViewの項目の背景を変更したいと思います。 '250 ms点滅'。そのような何か:

listView1.Items[1].BackColor = Color.LightGreen; 
listView1.Items[2].BackColor = Color.LightGreen; 

Thread.Sleep(250); 

for (int i = 0; i < args.Length; i++) 
{ 
    listView1.Items[i].BackColor = Color.White; 
} 

しかし、私は、ソートを開始しようとしているとき、UIが凍結され、数秒後にそれがSortedCollectionとして表示されます。

私の質問は次のとおりです。
ソート中にUIに「ライブ」アクションを表示するにはどうすればよいですか?

+0

あなたの質問はあまり明確ではありません。なぜあなたがThread.Sleepを使うのか説明してください。 –

+0

色の変化をユーザーに見せるためです。その後、色が白に戻ります。このコードは、すべてのコードのほんの一部です。それが私の問題だと私は思う。 – Variat

+0

これがWindowsフォームの場合は、Application.DoEventsを呼び出すことができます。 WPFの場合は、アニメーションをスタイルに実装する必要があります。 – hoodaticus

答えて

0

Thread.Sleep(250)の代わりにawait Task.Delay(250)を使用してください。これを可能にするには、あなたのメソッドにマークを付ける必要がありますasync

+0

私はこれを試していましたが、どのメソッドを非同期にするべきかわかりません。イベントを呼び出すとコレクション内のメソッドをソートする? UIクラスのソートを開始するメソッド。 method(){collection.QuickSort()}?たぶん私はすべてのオプションを試していない可能性があります。非同期メソッドをどの段階で作成すればいいのですか? – Variat

+0

'async void'を返すべきである最後のもの(たぶんボタンクリックイベント)の代わりに、' async Task'を返すように呼び出し階層内のすべてのメソッドを変更して、それらを上位メソッドで待ちます – tomassino

+0

私はすでに方法を見つけましたが、とにかく感謝します。私はそれが将来的に私にとって役に立つと確信しています。 :) – Variat

関連する問題