Мой вопрос в том, как я могу остановить долговременную задачу (.net 4)? Я внедрил TPL и попытался использовать CancellationTokenSource, но он, похоже, не работает для моего сценария. Все примеры, которые я видел, предполагают, что вы выполняете работу в цикле while, чтобы вы могли проверить, была ли задача отменена, тогда как я просто выполняю одну операцию, которая занимает много времени. Я не могу дождаться завершения работы, поскольку мне нужно предположить, что она никогда не завершится. Вот код, который я пробовал:
bool? result = null;
var cs = new CancellationTokenSource();
var ct = cs.Token;
var doWorkTask = new Task(() =>
{
Console.WriteLine("start dowork task");
result = Work.LongRunning();
}, ct);
doWorkTask.Start();
Task.WaitAny(new Task[] { doWorkTask }, timetowait);
if (doWorkTask.IsCompleted)
{
Console.WriteLine("dowork task completed");
doWorkTask.Dispose();
}
else
{
Console.WriteLine("dowork task has timedout");
cs.Cancel();
throw new TimeoutException("Timeout hit.");
}
Код работает, но задача никогда не удаляется, если происходит "тайм-аут", и работа, которая выполняется, обращается к "неуправляемому коду", то есть к ресурсам. Тем не менее IsCancelledRequested не может использоваться в Work.LongRunning(), поэтому я не могу ThrowIfCancellationRequested.
Я открыт для других идей, а также я попытался BackgroundWorker, но это также похоже не подходит.
Новый пример:
var service = new System.ServiceProcess.ServiceController(ServiceName, ServerName);
var serviceTask = Task.Factory.StartNew(() =>
{
result = (service.Status == ServiceControllerStatus.Running
|| service.Status == ServiceControllerStatus.StartPending);
}, cs.Token);
serviceTask.Wait(2000, cs.Token);
if (!serviceTask.IsCompleted)
{
cs.Cancel();
}