取消Dispose方法中的任务

Dav*_*New 8 .net c# parallel-processing idisposable task-parallel-library

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

这是正确的方法:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dou*_*las 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是因为这样做是安全的,因为你可以保证任务会在那时终止.但[你真的不需要](http://blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx). (2认同)
  • 9年后:这是一个好的模式吗?您在处置路径中调用“Wait”,从而阻止清理。这可能会对性能产生重大影响。 (2认同)
  • @JHBonarius:我已经更新了示例以使用“IAsyncDisposable”(从那时起就引入了)。您是想等待“Task”,还是只是一劳永逸地处理它,取决于实际的用例。 (2认同)