проверка работоспособности потока

#c# #multithreading #service #.net-4.0

#c# #многопоточность #Обслуживание #.net-4.0

Вопрос:

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

  1. для запуска задачи
  2. возврат обратно к пользовательскому интерфейсу (его веб-странице)
  3. периодически / случайным образом проверяйте, завершена ли задача
  4. отмените выполнение задачи, когда пользователь пожелает
  5. получать уведомления о завершении / сбое задачи

каковы возможные решения?

  1. Потоки?Запустите поток, сохраните его ManagedThreadId (можете ли вы получить поток по его идентификатору)
  2. написать службу 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