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

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

你们是如何处理这些案件的?

编辑:

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

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

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

4

1 回答 1

6

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

于 2013-08-26T12:22:44.997 回答