我的 C# 项目中有两个线程;UI 线程和 BackgroundWorker。
在 BackgroundWorker 中有一些工作,例如;
private void testBgWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
while (!worker.CancellationPending)
{
// Do some work!
token.WaitHandle.WaitOne(20000);
}
}
在 UI 线程中;
// Some initialization for CancellationToken
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
// Click event listener of the button!
private void testBtn_Click(object sender, EventArgs e)
{
testBgWorker.CancelAsync();
tokenSource.Cancel();
}
在 UI 线程中,当用户单击按钮时,BackgroundWorker 开始运行。如果用户单击第二个按钮,BackgroundWorker 将被取消。这个循环没有问题。
但是,当 BackgroundWorker 被取消后用户再次点击时,由于 IsCancellationRequested 为 true,线程不会在 token.WaitHandle.WaitOne(20000) 的行中等待,而是将其传递到下一行。这是个问题!
我不能多次使用令牌吗?如何在第二个周期再次将 canceltoken 的 isCancellationRequested 属性设置为 false?还是我必须使用新的取消令牌?