CancellationTokenSource,何时需要释放?

9

我应该什么时候处理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;
        }
    }

我应该像那样处理它吗? 如果是这样,那会有一些问题,因为我需要将其放入Disposer中,在应用程序关闭时进行处理,因为如果我不仔细等待,就不能保证它不会被处理,这会导致ObjectDisposedException异常。 我甚至尝试了这个来防止异常(因为我不想使用Try Catch,在这种情况下,我希望一开始就不会出现错误)。
        if (CTSSend != null)
        {
            CTSSend.Cancel();
            CTSSend.Dispose();
        }
        if (CTSReceive != null)
        {
            CTSReceive.Cancel();
            CTSReceive.Dispose();
        }

好的,也许最后我应该只在最后处理它,并且不要在每次取消后处理它? 尽管我不喜欢这样会向新对象添加资源。

你们在这些情况下该怎么做?

编辑:

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

如何将布尔值绑定到CancellationToken上? 这样我就可以像CTS.IsDisposed这样拥有一些东西;

一些对象有这个功能,但CTS没有,如果有这个功能,就可以解决我的问题。 我目前正在单独使用一个布尔值,这不是我喜欢的事情。


4
是的,这是一份“重复”的文件,但是其他人并没有得到一个真正的答案,每个人都说不同的话。有些人认为可以让它存在,有些人则认为你必须处理掉它。我想知道,如果已经处理掉了,当你关闭时怎么能排除异常的机会。 - Zerowalker
1个回答

6

4
即使不方便,也应该处理IDisposable实例。 - Samuel Neff
1
@SamuelNeff 所以在 Winforms 应用程序中,所有控件都被处理了? :-) 关键字在于“应该”,而不是“必须”。 - xanatos
@SamuelNeff 我补充一下,我做了一些研究...例如,在类似“Task”的东西上:https://dev59.com/D2025IYBdhLWcg3weF6S#5986082 - xanatos
8
从那里,转到msdn上Stephen Toub的回复:“简而言之,在.NET中通常情况下,如果基于你代码结构的情况下Dispose变得容易且正确,就积极地进行Dispose。如果你开始必须做一些奇怪的操作才能Dispose(或在任务的情况下,使用额外的同步来确保安全地Dispose,因为Dispose只能在任务完成后使用一次),最好依赖终结来解决问题。” - xanatos
1
@xanatos。关于Winforms,是的,应该显式地释放,因为大部分图形是不受管理的。然而,我并没有看到一个“严格”的理由需要 CTS。Toub 的答案已经很完美地解释了该怎么做。 - Mario Vernari
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接