C# 线程同步:暂停工作线程

C# 线程同步:暂停工作线程,c#,wpf,multithreading,C#,Wpf,Multithreading,我有工作线程和主线程,主线程链接到UI,可以要求工作线程停止工作。 我的线程运行一个检查布尔值的“无限”循环,主线程可以修改该值以停止所有线程 在我的工作线程中: while (not_terminated) { /* Process */ } 主线程: private void stop_btn_clicked(object sender, RoutedEventArgs e) { not_terminated = false; } 我需要我的主线程来暂停工作线程,我想

我有工作线程和主线程,主线程链接到UI,可以要求工作线程停止工作。
我的线程运行一个检查布尔值的“无限”循环,主线程可以修改该值以停止所有线程

在我的工作线程中:

while (not_terminated)
{
    /* Process */
}  
主线程:

private void stop_btn_clicked(object sender, RoutedEventArgs e)
{
    not_terminated = false;
}

我需要我的主线程来暂停工作线程,我想到了一个只读互斥,所有的工作人员都可以读,但只能由主写,就像是C++的“SydDyMutX”。我目前的解决方案是使用

Thead.Suspend()
Thread.Resume()
,但它们似乎是一种非常糟糕的做法……
我是C#的新手,我发现如果没有信号发送到互斥锁,函数就会阻塞,事实上我在寻找相反的结果:如果发送信号,函数就会阻塞

你会怎么做


编辑:我希望避免外部库

仅检查布尔值是不安全的,您需要一个内存屏障来确保线程安全。我相信将bool指定为volatile应该可以做到这一点

听起来您想在事件之间发送一个信号,因此manualResetEvent//autoResetEvent中的一个可能是合适的。您还可以使用锁使用的,类似于互斥锁,但这可能不适用于信令

如果您只需要停止线程一次,那么cancellationToken/可能是合适的


现代的方法是不使用专用线程,而是在需要时使用线程池中的线程。这也适用于异步/等待和任务模式。如果需要线程以独占方式访问资源,可以使用任务调度器。例如或

可能使用?相关:谢谢Matthew,我正在查看文档以实现它@TheodorZoulias,我想避免使用外部库,正如您在链接文章中所建议的,
Suspend()
Resume()
不仅不推荐使用,而且很危险(可能会在关键部分暂停线程),如果
PauseToken
正是您想要的,那么您可以抓住它并将其嵌入到您的项目中。如果不想添加第三方依赖项,则不需要添加。或者你可以从马斯金那里抢过来。@Maskim-这效率太低了。每个线程至少占用一兆字节。你正在使用256MB的线程。您通常只有8个内核,因此248个线程处于空闲状态。每根线都在做什么?谢谢你,还有你,我用的是ManualResetEventSlim,它就像一个符咒。我在所有线程上的“foreach”非常慢(~10秒)
Suspend()
。。。