gpt4 book ai didi

C# 在线程完成当前函数循环后使用按钮停止线程

转载 作者:行者123 更新时间:2023-12-04 03:22:28 25 4
gpt4 key购买 nike

我有一个 Windows 窗体应用程序,它使用开始按钮执行无限循环。我有一个停止按钮,我试图在循环完成一个循环后使用它来停止无限循环。

我试图使用 thread.Interrupt,它不允许循环完成。

我还使用了 thread.abort,它显然不允许循环完成。

我还尝试通过让停止按钮更新一个全局变量来做到这一点,我的线程内的 while 循环依赖该全局变量,但全局变量不会在线程内更新。

主类代码

startbutton()
{
handle = getHandle();
Loopclass.loopclass loop = new Loopclass.loopclass(handle);
thread = new Thread(()=>loop.run());
thread.Start();
}

stopbutton()
{
handle = getHandle();
Loopclass.loopclass loop = new Loopclass.loopclass(handle);
loop.setCh();
}

循环类代码

//_ch is a global string variable
Run()
{
while(_ch != "X")
{
//do stuff
string x = "";
_ch = getCh(x);
}
}

setCh()
{
_ch = "X";
}

getCh(string x)
{
x = "X";
return x;
}

最佳答案

使用任务和取消 token :

private CancellationTokenSource tokenSource;
startbutton()
{
handle = getHandle();
Loopclass.loopclass loop = new Loopclass.loopclass(handle);
tokenSource = new CancellationTokenSource();
var task = Task.Run(() => loop.Run(tokenSource.Token));
}

stopbutton()
{
tokenSource.Cancel();

//handle = getHandle();
//Loopclass.loopclass loop = new Loopclass.loopclass(handle);
//loop.setCh();
}

Run(CancellationToken token)
{
while(!token.IsCancellationRequested && _ch != "X")
{
//do stuff
string x = "";
_ch = getCh(x);
}
}

setCh()
{
_ch = "X";
}

getCh(string x)
{
x = "X";
return x;
}

关于C# 在线程完成当前函数循环后使用按钮停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68224183/

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