2015-08-05 6 views
2

Я почти полностью девственница в прорастающих/backgroundworkers и т.д.Задача WPF/C# async для манекенов: Как создать простой интерфейс UI/BL?

Я пытаюсь сделать это:

  1. Новое окно показывает статус процесса (этикетки) и имеет постоянный XAML определенные анимации с раскадровкой (три точки, представляющие процесс в фоновом режиме).
  2. Запустите некоторый фон интенсивного кода, для которого требуется некоторый ввод, и не возвращает выход.
  3. По завершении обновите пользовательский интерфейс сообщением
  4. Повторите 2 & 3 десятка раз с различными операциями в фоновом режиме каждый раз.

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

Мне нужен самый тонкий и простой способ сделать это. используя .Net 4.5, поэтому я считаю, что мы говорим о задачах, правильно?

Я читал десятки статей Stackoverflow и консультировался с дядей Google и тетей MSDN, но это потрясающе - есть много способов сделать это, и я немного потерялся.

Заранее спасибо.

+0

Посмотрите [на объект EventProgress '). (Http://www.codeproject.com/Articles/129447/Progress-Reporting-in-C-Async) –

+2

Проголосовало за закрытие слишком широко. Вы должны выбрать подход самостоятельно и спросить здесь подробности. Я бы рекомендовал эту серию Стивеном Клири: https://msdn.microsoft.com/en-us/magazine/dn605875.aspx Это, безусловно, хорошая отправная точка, а автор - гений 'async' /' await'. – Dennis

ответ

1

Что бы вы ни говорили, довольно просто сделать с асинхронным/ждущим. Поскольку вы сказали, что новичок в многопоточности, я рекомендую вам ознакомиться и ознакомиться с ним. Вот good start и this

Я предполагаю, что вы можете реализовать # 1 самостоятельно, и вам нужно всего лишь руководство по реализации отдыха. Поэтому я не буду говорить об этом в своем посте.

Теоретически вам нужна коллекция, в которой должен быть выполнен список работ, а затем начинать один за другим после завершения предыдущего.

дать некоторый образец кода

List<WorkItem> workItems = ...;//Populate it somehow 

private async Task DoWorkMain() 
{ 
    foreach (var item in workItems) 
    { 
     await DoWork(item); 
     //WorkItem completed, Update the UI here, 
     //Code here runs in UI thread given that you called the method from UI 
    } 
} 

private Task DoWork(WorkItem item) 
{ 
    //Implement your logic non blocking 
} 

Тогда где-то из вызова пользовательского интерфейса

await DoWorkMain(); 

WorkItem класс, который содержит данные о работе, которую предстоит сделать.

+0

Спасибо, @Sriram Sakthivel. Это общее направление, о котором я просил. Не могли бы вы рассказать о 'List workItems = ...; // Заполнить его каким-то образом? Пример? – zazkapulsk

+1

@zazkapulsk Вам нужно добавить некоторые элементы в список, чтобы вы могли его выполнить. то есть с параметрами, которые вам нужно сработать. 'workItems.Add (новый WorkItem (yourparameter1, parameter2))'. Надеюсь, у вас есть список работ, которые нужно выполнить где-то в вашей программе, вот что такое «Список workItems' –

+0

Спасибо. Вот и все. Я очень ценю это. – zazkapulsk

-2

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

+2

Плохая идея - создать поток.Поскольку «ThreadPool» был изобретен, в большинстве случаев нет необходимости управлять потоками вручную. Поскольку TPL (и, особенно, 'async' /' await') был выпущен, нет необходимости напрямую обращаться к 'ThreadPool'. – Dennis