【发布时间】:2022-01-26 17:54:02
【问题描述】:
我在 C# 中做一个表单应用程序,它是一个从服务器接收带有套接字的字符串的客户端,我有一个在接收函数内部运行无限循环的线程。当我单击一个按钮时,我必须停止该线程,我尝试使用一个布尔变量,但它不起作用,因为该函数卡在接收函数上,并且对布尔变量的控制在 when 仍然为真之前完成。我该怎么做才能停止这个线程?
这是线程运行的函数:
public void Prova()
{
while (true)
{
string str = frmRegister.c.Receive();
... doing things...
}
}
线程是这样启动的:
public Form1()
{
InitializeComponent();
t1 = new Thread(Prova);
t1.Start();
}
我必须在这里停止线程:
private void goBack_Click(object sender, EventArgs e)
{
new Form2().Show();
this.Hide();
}
以下是我对 CancellationToken 的尝试:
private CancellationTokenSource tokenSource;
public void Prova(CancellationToken token)
{
while(!token.IsCancellationRequested){
while (true)
{
string str = frmRegister.c.Receive();
... doing things...
}
}
}
public Form1()
{
InitializeComponent();
tokenSource = new CancellationTokenSource();
var task = Task.Run(() => Prova(tokenSource.Token));
}
private void goBack_Click(object sender, EventArgs e)
{
tokenSource.Cancel();
new Form2().Show();
this.Hide();
}
【问题讨论】:
-
这有点超出我的回答范围,其他人可以帮你解决,但我相信如果你查找“CancellationToken”,你可能会找到一个很好的例子,应该插入您的场景。这就是我开始寻找的地方。
-
我用 CancellationToken 尝试了一些东西,但它不起作用,也许我用错了方法。你能建议我如何使用它吗?很多人建议不要使用 Abort()
-
我已经尝试过使用 CancellationToken 但它不起作用 -> 发布该代码。
-
@Kevin - 永远不要用
.Abort()停止线程。它可能会破坏运行时并使其余线程处于未知状态。唯一的例外是当您试图从应用程序中崩溃时。 -
@sommmen 是的,我编辑了问题
标签: c# multithreading forms loops while-loop