【发布时间】:2022-01-25 09:33:31
【问题描述】:
我试图在按下中止键时停止程序中的 while 循环,并且正在运行的函数正在运行 Task.Delay。不幸的是,即使这必须很容易做到,我也无法让它为我工作。请帮忙。
我有一个按钮,要求用户确认他们想要运行,如果是,它会进入下面的函数并开始运行 RunSequence 函数。我确实在一个新线程上有这个,但现在已经将它更改为一个任务,我留下注释掉的代码以防万一我需要运行它而不是任务。 RunSequence 有两个参数,第二个是我认为我应该有的,那就是 CancellationToken。
CancellationTokenSource tokenSource = new CancellationTokenSource();
private void ConfirmRunSequence()
{
//put it on a thread as the UI is slow to update
//var thread = new Thread(() => { RunSequence(_filePathName, tokenSource.Token); });
//thread.IsBackground = true;
//thread.Start();
Task.Run(() => RunSequence(_filePathName, tokenSource.Token), tokenSource.Token);
}
当按下中止按钮时,我们将 Token 设置为取消,我想退出 While 循环。
private void onAbort()
{
Abort = true; //set to abort sequence
tokenSource.Cancel();
}
我希望上面的部分是正确的,我认为下一点是我不明白的。在这里,我有一个名为 _ct 的 CancellationToken,我认为它是 tokenSource。我在这里的延迟很大,所以当我看到标签更新几次时,我会点击中止,它会在我想取消的延迟之内。现在这是我无法开始工作的地方。
我在 _ct 下看到一个红色的波浪线,上面写着“无法从 System.Threading.CancellationToken 转换为 System.Threading.Task.Task”。好的,我阅读了这些文字,但抱歉我不知道如何修复它,但我也不知道我是否修复了它,如果这是退出 While 循环的正确方法,请帮助。
private async void RunSequence(string filePath, CancellationToken _ct)
{
Int count = 0;
while (!sr.EndOfStream)
{
lbl_count = count++;
await Task.WhenAny(Task.Delay(10000), _ct);
}
lbl_count =”aborted”;
}
我尝试过的事情之一是从 await Task.WhenAny(Task.Delay(10000), _ct);至 只是 Task.Delay(10000, _ct) 也不好。
【问题讨论】:
-
只需在
while循环中使用ct.ThrowIfCancellationRequested() -
不要使用新线程。有任务时就不需要了。
-
请出示您的真实密码。除非
lbl_count是object,否则您不能拥有lbl_count = count++;和lbl_count =”aborted”;。
标签: c# while-loop task abort