2

我的 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?还是我必须使用新的取消令牌?

4

0 回答 0