C# CancellationTokenSource,何时处置?
我应该什么时候处理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();
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();
}