我应该在什么时候处理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,在这种情况下,我甚至不想在第一个地方得到错误)。
if (CTSSend != null)
{
CTSSend.Cancel();
CTSSend.Dispose();
}
if (CTSReceive != null)
{
CTSReceive.Cancel();
CTSReceive.Dispose();
}但是,也许我应该只在最后处理它,而不是每次取消后都处理它?虽然我不喜欢这样不断地向一个新的对象添加资源。
你们这些人是怎么处理这些案子的?
编辑:
一个更具体的问题,可以解决它(在我的例子中)。
如何将布尔值绑定到CancellationToken?所以我可以有像CTS.IsDisposed这样的东西;
有些对象有这个功能,但是CTS没有,如果它有的话,它会解决我现在遇到的问题。我目前正在单独使用bool,这不是我喜欢的东西。
发布于 2013-08-26 20:22:45
他们在这里做了一些分析,When to dispose CancellationTokenSource?,似乎试图正确地处理它是非常无用的。让GC收集它(如果你查看几乎所有的MSDN示例,它都不会被处理)
https://stackoverflow.com/questions/18443813
复制相似问题