C# CancellationTokenSource,何时处置?

C# CancellationTokenSource,何时处置?,c#,.net,multithreading,C#,.net,Multithreading,我应该什么时候处理CancellationTokenSource? 例如,如果我每次单击按钮时都制作一个并将其放入线程中: private void Button_Click(object sender, EventArgs e) { if (clicked == false) { clicked = true; CTSSend = new CancellationTokenSource();

我应该什么时候处理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;
        }
    }
我应该这样处理它吗? 原因如果是这样的话,这将有点问题,因为我需要将其放入处理器中,该处理器将在应用程序关闭时进行处理,因为无法保证如果我没有仔细等待它,它不会被处理,这将导致ObjectDisposedException

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

但是,也许我应该在最后处理它,而不是每次取消后处理它? 虽然我不喜欢这样会不断地向新对象添加资源

你们这些人是怎么处理这些案子的

编辑:

一个更具体的问题将解决它(在我的例子中)

如何将bool绑定到CancellationToken? 所以我可以有像CTS.IsDisposed这样的东西

有些对象有这样的功能,但CTS没有,如果有,它会解决我的问题。
我目前正在单独使用bool,这不是我喜欢的。

他们在这里做了一些分析,似乎试图正确处理它是毫无用处的。让GC收集它(如果您查看几乎所有的MSDN示例,它都没有被释放)

IDisposable
实例应该被释放,即使这样做很不方便。@SamuelNeff所以在Winforms应用程序中所有控件都被释放了?:-)这里的关键词是“应该”,而不是“必须”。@SamuelNeff我会补充说我做了一些研究。。。例如,在诸如
Task
:@SamuelNeff以及从那里连接到msdn上Stephen Toub的链接响应:
简言之,与.NET中的典型情况一样,根据代码的结构轻松且正确地进行主动处置。如果为了处置而不得不进行奇怪的旋转(或者对于任务,使用额外的同步来确保处置的安全性,因为处置只能在任务完成后使用),那么最好依靠终结来处理事情。
@xanatos。关于Winforms,是的,应该显式地处理它,本质上是因为大多数图形都不受管理。然而,我不认为CTS有“严格”的理由。巨嘴鸟的答案完美地说明了该做什么。这是一个“重复”的答案,是的,但另一个并没有真正得到答案,每个人的回答都不一样。有人说,随它去吧,也有人说,你必须处理掉它。我想知道,如果它已经被处理掉了,当你关闭时,你怎么能在没有例外的情况下处理它呢。
        if (CTSSend != null)
        {
            CTSSend.Cancel();
            CTSSend.Dispose();
        }
        if (CTSReceive != null)
        {
            CTSReceive.Cancel();
            CTSReceive.Dispose();
        }