У меня есть какой-то долго работающий код, который я хотел бы запустить как Task
и отменить при необходимости, используя CancellationTokenSource
, но отмена не работает, так как моя задача продолжает выполняться, когда вызывается tokenSource.Cancel()
(без исключения брошено).
Возможно, упускаете что-то очевидное?
Сокращенный пример ниже:
bool init = false;
private void Button1_Click(object sender, EventArgs e)
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
Task task = new Task(() =>
{
while (true)
{
token.ThrowIfCancellationRequested();
if (token.IsCancellationRequested)
{
Console.WriteLine("Operation is going to be cancelled");
throw new Exception("Task cancelled");
}
else
{
// do some work
}
}
}, token);
if (init)
{
tokenSource.Cancel();
button1.Text = "Start again";
init = false;
} else
{
try
{
task.Start();
} catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
button1.Text = "Cancel";
init = true;
}
}