2013-04-08 3 views
-1

Мое приложение имеет следующие поведения:дизайн (шаблон) для многопоточного приложения

  • Вы можете загрузить удар файлов
  • Вы можете начать измерение выбранных файлов
  • Вы можете остановить измерение

Измерение само по себе длится очень долго, поскольку для этого используется внешнее оборудование. Длинные означает примерно 1 минуту в файле.

Для того, чтобы пользовательский интерфейс не замерзал, это измерение должно быть реализовано в отдельной задаче.

Но как реализовать метод safe, чтобы остановить измерение и резьбу?

Я разработал аналогичное приложение в python. В этом я сам внедрил измерение как statemachine, тогда как каждое государство является собственным классом. Каждый переход состояния я проверяю, есть ли сигнал для остановки. Если это так, я перехожу в состояние Finish и безопасно останавливаю измерение.

Как реализовать такое поведение с помощью C#?

+0

Ist это веб-приложение? – Siraf

+0

Вы должны проверить [CancelationToken] (http://msdn.microsoft.com/en-us/library/dd997396.aspx). –

+0

Как выполнить длительную операцию в приложении winform является * очень * распространенным вопросом, как правило, что-то связанное с ним задается здесь несколько раз в день. Вы должны сделать некоторые исследования по этому вопросу, поскольку информация широко доступна. – Servy

ответ

0

Если это WinForms, то используйте BackgroundWorker, который публикует события, чтобы сигнализировать о прогрессе и завершении. События из BackgroundWorker запускаются в потоке переднего плана, поэтому вы можете обновлять элементы пользовательского интерфейса без использования Invoke. Ссылка: http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx

+0

Те же комментарии, что и выше. – Razer

0

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

MSDN статья о том, как использовать фон рабочие потоки:

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

+0

Я знаю фоновых работников - это не проблема. Скажем, длительное измерение - это бизнес-логика. Как реализовать безопасный способ остановить бизнес-логику и сделать своего рода «остановку» измерения. Внедрение самого измерения в качестве statemachine дало мне возможность реализовать переход состояния как своего рода «точку отмены» - как это сделать в приложении winforms? Я не хочу загрязнять бизнес-логику кодом, касающимся потоков. – Razer

+0

Фон работников поддержки отмены. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync.aspx Одна проблема заключается в том, что если поток находится в длительной операции ввода-вывода (говорящий о поиске файла для строки), я не думаю, что CancelAsync приводит к остановке ввода-вывода. Если чтение из файла является лишь малой частью общей бизнес-логики, этого должно быть достаточно. –

+0

Я знаю, что фоновые работники поддерживают отмену. Мой вопрос заключается в том, как разработать бизнес-логику для этого. Измерение связывает несколько внешних устройств (таких как робот, источник питания, усилитель ...). Эти устройства нуждаются в безопасном отключении.Кроме того, в каждом случае не разрешается останавливаться - например, когда робот движется. Отмена разрешается только тогда, когда робот находится в желаемом положении. – Razer

Смежные вопросы