2017-02-01 5 views
1

Мне нужно создать приложение сортировки, которое отображает текущие операции.
Я сделал это вот так:Операции в фоновом режиме с реакцией пользовательского интерфейса

У меня есть коллекция int s. Внутри него у меня есть алгоритмы сортировки и «шаг» события, который выполняет две операции «например». сравнение, перестановка и т. д. и int[] элементов, с которыми я что-то делаю.

Я хочу изменить элемент фона в ListView, если сортировка делает что-то с определенными элементами. «250 мс мигает». Нечто подобное:

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; 
} 

Но когда я пытаюсь начать сортировку, пользовательский интерфейс замерзает и после нескольких секунд отображается как SortedCollection.

Мой вопрос:
Как показывать «живые» действия в пользовательском интерфейсе во время сортировки?

+0

Ваш вопрос не очень ясен. Объясните, почему вы используете Thread.Sleep. –

+0

Чтобы дать пользователю возможность увидеть изменение цвета. Затем цвет возвращается к белому. Этот код - это всего лишь небольшой фрагмент всего кода. Вот где я думаю, это моя проблема. – Variat

+0

Если это Windows Forms, вы можете вызвать Application.DoEvents. Если это WPF, вы должны реализовать это с анимацией в стиле. – hoodaticus

ответ

0

Вместо Thread.Sleep(250)await Task.Delay(250). Чтобы сделать это возможным, вам необходимо отметить свой метод как async

+0

Я пытался это сделать, но я не уверен, какой метод я должен сделать async. Метод сортировки внутри коллекции с вызовом события? Метод, который начинает сортировку в классе пользовательского интерфейса, например. method() {collection.QuickSort()}? Возможно, я не пробовал все варианты. Можете ли вы уточнить, на каком этапе я должен сделать асинхронный метод? – Variat

+0

Измените все методы в иерархии вызовов, чтобы возвращать 'async Task', а затем ждать их в верхнем методе, а не в последнем (вероятно, событие нажатия кнопки) - это должно возвращать' async void' – tomassino

+0

Я нашел путь уже, но спасибо в любом случае. Я уверен, что это будет полезно для меня в будущем. :) – Variat