2013-07-16 2 views
2

В настоящее время я выполняю проект, в котором используется элемент управления навигацией по страницам с помощью Window Workflow Foundation 4. Я могу добиться этого, заблокировав поток пользовательского интерфейса, пока поток WF не вернет URL-адрес.Отправка данных обратно в поток пользовательского интерфейса асинхронно

Но это также не является основополагающим, если мой WF-материал имеет длительное время обработки, тогда поток пользовательского интерфейса будет остановлен на определенное время, и пользователи не поймут об этом.

Любое руководство, в котором я могу асинхронно возвращать данные URL/страницы из WF4 и улавливать пользовательский интерфейс.

+0

Вы попробовали асинхронный обработчик? –

+0

нет, PKKG. К сожалению, я использую vs2010 только с .Net 4. Я изучаю предложение Шаамаа. Не стесняйтесь получать любые дополнительные предложения – JohnZai

ответ

0

Существует несколько вариантов, но все они вращаются вокруг создания многопоточного приложения.

Простейший * подход, я думаю, заключается в использовании класса BackgroundWorker (usage example).

Другие варианты включают использование async и await ключевых слов, доступных в .NET 4.5 (если вы используете эту версию dotNET). Если вы используете более старую версию и не хотите использовать BackgroundWorker, вы можете использовать класс Task для создания фоновых задач. Еще более примитивный метод включает использование и управление экземплярами Thread (если класс Task недоступен). Видя, как вы используете WF 4, некоторые из новых методов должны работать нормально. ;)

Следует отметить, что большинство людей, начинающих с многопоточности, забывают (были там, сделаны) - вы не можете получить доступ к ресурсам, принадлежащим потоку пользовательского интерфейса (основной поток вашего приложения) из другого потока! Вот почему BackgroundWorker может быть хорошим решением для запуска, поскольку он предоставляет 2 события (ProgressChanged и RunWorkerCompleted), которые позволяют вам выполнять работу с пользовательским интерфейсом по мере необходимости.

* - by easyiest Я имею в виду, что проще всего начать с! Например, async/await лучше подходят для приложения, которое должно выполнять множество различных асинхронных операций, но опять же это не так просто, пока вы не повесите многопоточность в целом.

На самом деле вы не указали, сколько асинхронных операций будет выполняться вашим приложением, и вы упомянули, что они ограничены .NET 4.0 (так что нет async/await). Если вам нужно выполнить много разных операций, я бы рекомендовал использовать класс Task.

С небольшим усилием вы можете использовать задачи для создания рабочего многопоточного приложения, не прибегая к созданию спагетти-кода, который может стать настоящим кошмаром. Это особенно полезно, если вы застряли с использованием методов асинхронизации Begin-End в ваших сервисах - Task.Factory.FromAsync может быть ДЕЙСТВИТЕЛЬНО полезным в этом случае. Асинхронные службы, управляемые событиями, также должны выставлять интерфейс, который использует Begin-End.