У меня возникли проблемы с остановкой задачи. Во-первых, я только начал использовать Задачи. Раньше я использовал делегат.BeginInvoke() для работы в фоновом режиме, но на этот раз мне нужно остановить фоновое выполнение, если это необходимо. Поэтому я переключился на «Задачи». Это мой код:Не удается отменить задачу с помощью CancellationTokenSource.Cancel()
CancellationTokenSource token = new CancellationTokenSource();
Task posting = Task.Factory.StartNew(() => DoPosting(docs, session), token.Token);
HttpRuntime.Cache[session.ToString() + "_token"] = token;
HttpRuntime.Cache[session.ToString() + "_task"] = posting;
Это ASP.NET MVC, поэтому я храню долговечные вещи в HttpRuntime.Cache. Пользователь может отменить операцию с помощью этого действия:
public JsonResult StopPosting(string session)
{
CancellationTokenSource token = (CancellationTokenSource)HttpRuntime.Cache.Get(session.ToString() + "_token");
Task posting = (Task)HttpRuntime.Cache[session.ToString() + "_task"];
token.Cancel();
return Json(new { Message = "Stopped!" });
}
Теперь, когда это действие попадает в первый раз, ничего не происходит. Затем я запрашиваю отмену во второй раз. Теперь, token.IsCancellationRequested говорит «true», поэтому token.Cancel() должен что-то сделать. Но posting.Status все еще «работает». Он будет оставаться таким, пока он не завершится, а затем «RunToCompletion».
Итак, я попросил отменить задание, но он был отменен.
Возможно, я что-то делаю неправильно, или мне не хватает чего-то очевидного, но я просто не могу понять/понять, почему он не отменит.
Возможно, кто-то может пролить свет?
С уважением.
У вас есть что-нибудь в вашем методе DoPosting, который периодически проверяет состояние токена и, если необходимо, выходит из него? См. Это для примера: _ [Отмена в управляемых потоках] (http://msdn.microsoft.com/en-us/library/dd997364.aspx) _ –
Совсем нет. Он выполняет тяжелую работу с базой данных. Я знаю, что я должен позаботиться о том, что там происходит, но я не могу преодолеть первое препятствие. Спасибо за ссылку. –