我应该什么时候处理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,这不是我喜欢的。
答案 0 :(得分:5)
他们在这里进行了一些分析When to dispose CancellationTokenSource?,似乎尝试正确处理它是没有用的。让GC收集它(如果您查看几乎所有的MSDN示例,它都不会被处理)