#c# #multithreading #service #.net-4.0
#c# #многопоточность #Обслуживание #.net-4.0
Вопрос:
для задачи, выполнение которой может занять слишком много времени, мне бы хотелось, чтобы механизм
- для запуска задачи
- возврат обратно к пользовательскому интерфейсу (его веб-странице)
- периодически / случайным образом проверяйте, завершена ли задача
- отмените выполнение задачи, когда пользователь пожелает
- получать уведомления о завершении / сбое задачи
каковы возможные решения?
- Потоки?Запустите поток, сохраните его ManagedThreadId (можете ли вы получить поток по его идентификатору)
- написать службу Windows, отправить запрос в службу через общие объекты / файлы / БД? продолжать взаимодействовать со службой таким же образом (объекты / файлы / БД и т. Д.) Службы?
Комментарии:
1. Какую версию .NET вы используете? Похоже, библиотека параллельных задач в .NET 4 была бы идеальной для этого…
2. @JonSkeet TPL на ASP.NET Веб-страница? Вы уверены?
3. @Hasan — ах, не видел этого бита. Не на самом веб-сервере, но, вполне возможно, в службе, поддерживающей пользовательский интерфейс. Задачи определенно могут оставаться актуальными.
4. @HasanKhan: Ну, если вы запускаете его как «длительный», планировщик должен учитывать это. По сути, если вы запускаете несколько потоков, задач, чего угодно, тогда они будут бороться за время.
5. @JonSkeet ты прав. Только что проверил, что LongRunningTask фактически создает новый поток вместо использования thread в пуле потоков.
Ответ №1:
Разместите службу WCF в службе Windows, которая будет выполнять фоновые задачи путем добавления / чтения из очереди, которая может поддерживаться либо с помощью MSMQ, либо в базе данных.
Когда вы добавляете элемент для обработки; вы должны получить идентификатор задачи. Затем вы должны иметь возможность регистрировать статус завершения / сбоя / отмены задачи в БД по идентификатору задачи.
В вашем контракте WCF могут быть следующие методы
int ProcessItem(ItemDetails details); // returns task id
bool CancelTask(int taskID); // returns true if successfully cancelled; false otherwise
TaskStatus GetTaskStatus(int taskID); // returns Cancelled, Waiting, Failed or Completed
Комментарии:
1. это выглядит как хорошее общее решение, которое может быть сопряжено с системой сообщений запроса / ответа, совместно использующей идентификатор запроса.
Ответ №2:
Вы можете сделать это в одном процессе, взглянув на библиотеку Task Paralell и / или поток данных TPL
http://msdn.microsoft.com/en-us/library/dd460717.aspx http://go.microsoft.com/fwlink/?LinkId=205053