在Dispose方法取消任务 [英] Cancelling tasks in the Dispose method

查看:159
本文介绍了在Dispose方法取消任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有产卵,可以无限期地运行各种任务的类。当该对象被布置,我想停止运行的任务。



这是正确的做法:

 公共MyClass类:IDisposable接口
{
//东西

公共无效的Dispose()
{
的Dispose(真);
GC.SuppressFinalize(本);
}

受保护的虚拟无效的Dispose(BOOL处置)
{
如果(处置)
{
queueCancellationTokenSource.Cancel();
feedCancellationTokenSource.Cancel();
}
}
}


解决方案

您是在正确的轨道上。不过,我会建议等待任务从处置返回之前终止的方法,以避免竞争条件,可在任务延续了对象已被释放后运行。同时处置 CancellationTokenSource

 公共MyClass类:IDisposable的
{
私人只读CancellationTokenSource feedCancellationTokenSource =
新CancellationTokenSource();
私人只读任务feedTask;

公共MyClass的()
{
feedTask = Task.Factory.StartNew(()=>!
{
,而(feedCancellationTokenSource.IsCancellationRequested)
{
//做工作有限
}
});
}

公共无效的Dispose()
{
的Dispose(真);
GC.SuppressFinalize(本);
}

受保护的虚拟无效的Dispose(BOOL处置)
{
如果(处置)
{
feedCancellationTokenSource.Cancel();
feedTask.Wait();

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


I have a class which spawns various tasks which can run indefinitely. When this object is disposed, I want to stop those tasks from running.

Is this the correct approach:

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();
        }
    }
}

解决方案

You're on the right track. However, I would suggest waiting for the task to terminate before returning from the Dispose method, in order to avoid race conditions where the task continues to operate after the object has been disposed. Also dispose the 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();
        }
    }
}

这篇关于在Dispose方法取消任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆