我的問題是如何停止長時間運行的任務(.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();
}
感謝您的響應!我查看了Begin \ End模式,然後檢查End的結果((任務)isyncResult)。結果必須等到它完成。我對我的例子進行了更新。由於ServiceController上的屬性似乎在你檢查一個值時會被延遲加載,所以它可能需要很長的時間... –
nickv
我必須承認我無法完全遵循你的代碼,但爲什麼你不用ContinueWith添加延續? – Stilgar
因爲我不想繼續新的任務。我有一個任務需要執行,即使已被調用Cancelled,任務也可能不會響應,因此任務將永遠處於運行狀態。 – nickv