Как я могу отменить длительную задачу, перенаправив токен внутри задачи, а не внутри метода, который вызывает задача?
Мой код:
class Program
{
static void Main(string[] args)
{
CancellationTokenSource token = new CancellationTokenSource();
Stopwatch stop = new Stopwatch();
stop.Start();
Task.Factory.StartNew(() => myLongTask(6000), token.Token);
while (true)
{
Thread.SpinWait(1000);
if (stop.ElapsedMilliseconds > 3000)
{
token.Cancel();
}
}
}
public static void myLongTask(int time)
{
var sw = Stopwatch.StartNew();
Console.WriteLine("Task started");
while (true)
{ }
Console.WriteLine("Task ended");
}
}
Эта задача никогда не отменяется. Если я пересылаю токен в методе myLongTask()
, я могу непрерывно прослушивать, если отмена была вызвана, однако я не уверен... Как вы можете сделать это таким образом?
Thread.Abort
— но это может легко привести к трудно поддающимся очистке состояниям — вот почему почти любой современный подход к отмене принимает кооперативный стиль. Так что нет, я бы не рекомендовал альтернативу - сделать код, который должен быть отменяемым, с учетом токенов отмены. - person Damien_The_Unbeliever   schedule 31.10.2016