如何停止一个长时间运行的任务(.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.");
}
代码可以正常工作,但如果超时发生并且正在进行的工作访问"非托管代码"即资源,则任务永远不会被处理。也就是说,在Work.LongRunning()中无法使用IsCancelledRequested,因此我无法使用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();
}