gpt4 book ai didi

c# - 使用 AutoResetEvent 暂停/恢复线程

转载 作者:太空狗 更新时间:2023-10-29 22:34:54 24 4
gpt4 key购买 nike

在这段代码中,我想使用 AutoResetEvent 和 bool 变量暂停/恢复线程。如果 blocked==true 是否可以暂停而无需每次测试(在 Work() 的 for 循环中)?“阻塞”变量的测试也需要锁定,我认为这很耗时。

class MyClass
{
AutoResetEvent wait_handle = new AutoResetEvent();
bool blocked = false;

void Start()
{
Thread thread = new Thread(Work);
thread.Start();
}

void Pause()
{
blocked = true;
}

void Resume()
{
blocked = false;
wait_handle.Set();
}

private void Work()
{
for(int i = 0; i < 1000000; i++)
{
if(blocked)
wait_handle.WaitOne();

Console.WriteLine(i);
}
}
}

最佳答案

是的,您可以使用 ManualResetEvent 来避免正在执行的测试。

ManualResetEvent 将让您的线程通过,只要它被“设置”(发出信号),但与您之前的 AutoResetEvent 不同,它不会自动重置作为线程通过它。这意味着您可以将其设置为允许在循环中工作,并可以将其重置为暂停:

class MyClass
{
// set the reset event to be signalled initially, thus allowing work until pause is called.

ManualResetEvent wait_handle = new ManualResetEvent (true);

void Start()
{
Thread thread = new Thread(Work);
thread.Start();
}

void Pause()
{

wait_handle.Reset();
}

void Resume()
{
wait_handle.Set();
}

private void Work()
{
for(int i = 0; i < 1000000; i++)
{
// as long as this wait handle is set, this loop will execute.
// as soon as it is reset, the loop will stop executing and block here.
wait_handle.WaitOne();

Console.WriteLine(i);
}
}
}

关于c# - 使用 AutoResetEvent 暂停/恢复线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3228211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com