【发布时间】: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