Метод CancellationTokenSource.Cancel не изменяется Свойство CancellationToken.IsCancellationRequested - PullRequest
0 голосов
/ 31 октября 2019

Кто-нибудь знает, что я делаю неправильно?

Windows 10 - VS2013

C # .NET 4.5.1

У меня есть кнопка с именем testButton и метод testButton_Clickчто я пытаюсь использовать, чтобы сделать работу, но и быть в состоянии прервать эту работу. Выполнение работы в задаче работает, и логика прерывания выполняется (кнопка возвращается к серому «Выполнить тест»), но метод cts.Cancel, похоже, не влияет на флаг IsCancellationRequested токена илизадание имеет неправильный токен, или что-то ...?

public System.Threading.Tasks.Task DoWorkAsync(CancellationToken ct = default(CancellationToken))
{
    System.Threading.Tasks.Task T1 = new System.Threading.Tasks.Task(() =>
    {
        try
        {
            var capturedToken = ct;
            // do work here
            for (int i = 0; i < work.Length; i++)
            {
                ct.ThrowIfCancellationRequested();
                capturedToken.ThrowIfCancellationRequested();
                if (ct.IsCancellationRequested) throw new OperationCanceledException(ct);
                // sleep 1 second
                System.Threading.Thread.Sleep(1000);
            }
        }
        catch
        {
            MessageBox.Show("Caught :) I can do stuff", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            taskRunning = false;
        }
    }, ct);
    return T1;
}


private async void testButton_Click(object sender, EventArgs e)
{
    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationToken ct = cts.Token;
    var task = DoWorkAsync(ct);

    if (!taskRunning)
    {
        Cursor.Current = Cursors.WaitCursor;
        testButton.BackColor = Color.Red;
        testButton.Text = "ABORT";
        taskRunning = true;
        task.Start();
        await task;

        // Release cursor when setup is complete
        Cursor.Current = Cursors.Default;
    }
    else
    {
        cts.Cancel();
        testButton.Text = "Run Test";
        testButton.BackColor = Color.Gray;
    }
}
...