【问题标题】:CancellationTokenSource, When to dispose? [duplicate]CancellationTokenSource,何时处置? [复制]
【发布时间】:2013-08-26 12:14:12
【问题描述】:

我应该何时处置 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 没有,如果有,它会解决我遇到的问题。 我目前正在单独使用 bool,这不是我喜欢的。

【问题讨论】:

  • 这是一个“重复”是的,但另一个并没有真正得到答案,每个人都说不同。有人说,没关系,有人说,你必须处理掉它。我想知道,如果它已经被处理掉了,当你关闭它时,你如何处理它而不会有异常的机会。

标签: c# .net multithreading


【解决方案1】:

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

【讨论】:

  • IDisposable 实例应该被处理掉,即使这样做不方便。
  • @SamuelNeff 那么在 Winforms 应用程序中所有的控件都被释放了吗? :-) 这里的关键词是“应该”,而不是“必须”。
  • @SamuelNeff 我会补充一点,我做了一些研究......例如,在类似Task:stackoverflow.com/a/5986082/613130
  • @SamuelNeff 从那里到 Stephen Toub 在 msdn 上的链接回复:In short, as is typically the case in .NET, dispose aggressively *if* it's easy and correct to do based on the structure of your code. If you start having to do strange gyrations in order to Dispose (or in the case of Tasks, use additional synchronization to ensure it's safe to dispose, since Dispose may only be used once a task has completed), it's likely better to rely on finalization to take care of things.
  • @xanatos。关于 Winforms,是的,应该明确处理,主要是因为大多数图形都没有管理。但是,我没有看到 CTS 的“严格”原因。 Toub 的回答完美地说明了该怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多