如何在C#项目中第二次取消cancellationtoken

如何在C#项目中第二次取消cancellationtoken,c#,multithreading,backgroundworker,cancellationtokensource,cancellation-token,C#,Multithreading,Backgroundworker,Cancellationtokensource,Cancellation Token,在我的C#项目中有两个线程;UI线程和BackgroundWorker 在BackgroundWorker中有一些工作,例如 private void testBgWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; while (!worker.CancellationPending) {

在我的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)行中等待并将其传递给下一行这是个问题


我不能多次使用令牌吗?如何在第二个周期中使cancellationtoken的isCancellationRequested属性再次为false?或者我必须使用新的取消令牌吗?

您可以多次使用取消令牌,但只能取消一次。您需要创建一个新的
CancellationTokenSource
,以重新开始。你为什么要把取消代币和
BackgroundWorker
混在一起?它们是两种完全不同的异步技术,很少一起使用。@Alex Skalozub当用户点击按钮时,某些进程必须每20秒重复运行一次。所有过程都必须异步完成。此外,当用户再次点击按钮时,此过程应停止。也许,我可以使用Thread.Sleep(20000)代替WaitOne方法,但当用户单击按钮停止进程时,它会导致不必要的等待。如果您对此有什么建议,我愿意听您的:)如果您更喜欢
BackgroundWorker
而不是基于任务的方法,那么只需创建一个
ManualResetEvent
,您可以在取消工作程序时设置它,并在重新启动时重置。@AlexSkalozub我将检查ManualResetEvent机制以将其放入我的代码中。非常感谢你的贡献!你问的问题并不完全清楚。正如Alex所说,一旦被取消,就不能重用
CancellationTokenSource
。只能取消一次。时期如果没有一个好的和更好的描述,你想要代码做什么,就很难知道你真正想要的是什么。