CancellationTokenSource,何时处置?

Zer*_*ker 9 .net c# multithreading

什么时候我应该处理CancellationTokenSource?如果我例如制作一个并且每次点击一个按钮就把它放在线程中:

    private void Button_Click(object sender, EventArgs e)
    {
        if (clicked == false)
        {

            clicked = true;
            CTSSend = new CancellationTokenSource();
            Thread1 = new Thread(() => Method1(CTSSend.Token)); 
            Thread1.Start();
            Thread2 = new Thread(() => Method2(CTSSend.Token)); 
            Thread2.Start();
        }
        else
        {
            CTSSend.Cancel();
            CTSSend.Dispose();
            clicked = false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我应该这样处理吗?因为如果是这样的话,它会有点问题,因为我需要把它放在Disposer中,当应用程序关闭时会将其处理掉,因为如果我不小心等待它,就不能保证它不会被处理掉,这将导致ObjectDisposedException.

我甚至试图用这个来防止异常(因为我不想使用Try Catch,我想在这种情况下首先得不到错误).

        if (CTSSend != null)
        {
            CTSSend.Cancel();
            CTSSend.Dispose();
        }
        if (CTSReceive != null)
        {
            CTSReceive.Cancel();
            CTSReceive.Dispose();
        }
Run Code Online (Sandbox Code Playgroud)

但是,也许我应该只处理它,并且每次取消后都不要处理它?虽然我不喜欢如何继续为新对象添加资源.

你们这些人如何处理这些案件?

编辑:

一个更具体的问题,将解决它(在我的情况下).

我如何将一个bool绑定到CancellationToken?所以我可以有类似CTS.IsDisposed的东西;

有些对象有,但CTS没有,如果有,它将解决我遇到的问题.我目前正在单独使用bool,这不是我喜欢的.

xan*_*tos 5

他们在这里做了一些分析何时处理CancellationTokenSource?并且似乎尝试正确处理它是没有用的.让GC收集它(如果您查看几乎所有的MSDN示例,它都不会被处理)

  • @SamuelNeff从那里开始,对于Stephen Toub在msdn上的链接响应:"简而言之,就像在.NET中的情况一样,如果基于代码的结构很容易和正确的话,请进行积极的处理.如果您开始为了Dispose而进行奇怪的旋转(或者在任务的情况下,使用额外的同步以确保它可以安全处置,因为Dispose可能只在任务完成时使用),所以最好依靠完成照顾好事情 (4认同)
  • 应该处理`IDisposable`实例,即使这样做不方便. (3认同)