Должен ли я запустить все в фоновом потоке? - PullRequest
1 голос
/ 15 февраля 2010

Я разрабатываю приложение, которое может зависнуть при ожидании данных с серверов (базы данных или Интернета), проблема в том, что я не знаю, как лучше всего справиться с множеством разных мест, которые могут занимать время.

Я рад отображать диалоговое окно «загрузки» для пользователя во время доступа, но в идеале я не хочу, чтобы оно вспыхивало и исчезало при кратковременных операциях.

Microsoft Word, кажется, справляется с этим довольно хорошо, как будто вы нажимаете кнопку, и операция занимает много времени, через несколько секунд вы получаете диалог «работает ...». Операция все еще синхронна, и вы не можете ее прервать. Однако, если та же самая операция происходит быстро, вы, очевидно, не получите диалог.

Я счастлив (ish) изобрести некоторый общий обработчик фоновых рабочих потоков, и 99% моей обработки данных уже выполняется в статических атомарных методах, но я хотел бы использовать этот метод, если смогу.

Если у кого-то есть шаблоны, коды или предложения, я приветствую их всех

Приветствия

Ответы [ 3 ]

3 голосов
/ 15 февраля 2010

Я бы определенно думал асинхронно, используя шаблон с 2 событиями. Первое «событие» заключается в том, что вы на самом деле получили свои данные отовсюду / где бы вам ни пришлось их ждать. Второе событие - таймер задержки. Если вы получите свои данные до того, как этот таймер появится, все хорошо. Если нет, то вы выскакиваете свое «Я занят» и позволяете им отменить запрос. Обычно отмена означает просто «игнорировать», когда вы, наконец, получите ответ.

1 голос
/ 15 февраля 2010

Microsoft Word, кажется, справляется с этим довольно хорошо, как будто вы нажимаете кнопку, и операция занимает много времени, через несколько секунд вы получаете диалог «работает ...».Операция все еще синхронна, и вы не можете ее прервать.Однако, если та же самая операция происходит быстро, вы, очевидно, не получите диалоговое окно.

Если вы хотите именно такое поведение ...

Вы могли бы справиться с этим довольно легко,обтекание класса вокруг BackgroundWorker.Просто время начала события DoWork и время до первого отчета о проделанной работе.Если пройдет определенное количество времени, вы можете показать свое диалоговое окно - в противном случае, блокировать (так как это короткий процесс).

При этом, всякий раз, когда вы выполняете работу, которая может обрабатываться асинхронно, я 'Я рекомендую сделать это таким образом.Гораздо приятнее никогда не блокировать свой пользовательский интерфейс на заметный интервал, даже если он короткий.Это становится намного проще в .NET 4 (или 3.5 с платформой Rx) с помощью параллельной библиотеки задач .

0 голосов
/ 15 февраля 2010

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

...