取消Dispose方法中的任务

时间:2013-10-05 10:47:14

标签: c# .net parallel-processing task-parallel-library idisposable

我有一个类可以产生可以无限期运行的各种任务。处理此对象时,我想阻止这些任务运行。

这是正确的做法:

public class MyClass : IDisposable
{
    // Stuff

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            queueCancellationTokenSource.Cancel();
            feedCancellationTokenSource.Cancel();
        }
    }
}

1 个答案:

答案 0 :(得分:14)

你走在正确的轨道上。但是,我建议在从Dispose方法返回之前等待任务终止,以避免在对象被处置后任务继续运行的竞争条件。同时处理CancellationTokenSource

public class MyClass : IDisposable
{
    private readonly CancellationTokenSource feedCancellationTokenSource =
        new CancellationTokenSource();
    private readonly Task feedTask;

    public MyClass()
    {
        feedTask = Task.Factory.StartNew(() =>
        {
            while (!feedCancellationTokenSource.IsCancellationRequested)
            {
                // do finite work
            }
        });
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            feedCancellationTokenSource.Cancel();
            feedTask.Wait();

            feedCancellationTokenSource.Dispose();
            feedTask.Dispose();
        }
    }
}