3

我正在.net 中开始一些关于异步编程的测试,现在我被困在尝试使用cancellationToken 取消长时间操作。

所以我有以下代码:

CancellationTokenSource cancelationToken = new CancellationTokenSource();

我的按钮开始操作

    private void button2_Click(object sender, EventArgs e)
    {
        cancelationToken.Cancel(true);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        StartOperation(cancelationToken.Token);
    }

最后是我的操作

    private async void StartOperation(CancellationToken cancelToken)
    {
        await GetItensFromDatabase2(cancelToken);
    }

    public static Task<int> GetItensFromDatabase(CancellationToken cancelToken)
    {
        //cancelToken.Register( () => Console.WriteLine("Canceled") );
        return Task.Factory.StartNew<int>(() =>
        {
            int result = 0;

            cancelToken.ThrowIfCancellationRequested();

            result = MyLongOperation();  // Simulates my operation -> I want to cancel while this operation is still running

            return result;

        }, cancelToken);
    }

那么,如何取消 MyLongOperation() 方法?有可能吗?

4

2 回答 2

5

在任何时候都不能取消,CancellationToken 的目的是允许用户取消操作,当长时间运行的操作期望...

while(!finished)
{
     cancelToken.ThrowIfCancellationRequested();
     //Some not cancelable operations
}

这是可取消方法的更常见方法

private static void LongRunning(CancellationToken cancelToken)
{
    while (true)
    {
        if(cancelToken.IsCancellationRequested)
        {
            return;
        }
        //Not canceled, continue to work
    }
}

这个想法是,用户请求取消,但只有执行者决定何时停止他的工作。通常执行者在达到某个“安全点”后会取消

Abort长时间运行不征求意见的经验不好,已经写了很多帖子。

于 2014-01-15T10:24:03.133 回答
1

那么对于初学者来说,如果你已经运行了“cancelToken.ThrowIfCancellationRequested”的逻辑然后你取消,你会遇到一个问题。“MyLongOperation”如何知道您已取消任务?:)

取消一个长时间运行的任务通常需要一个 CancellationToken 作为参数,所以代码看起来像:

// Check if cancelled
// do work part 1
// Check if cancelled
// do work part 2

可取消操作的粒度取决于开发人员。

于 2014-01-15T10:29:43.197 回答