停止长嵌套循环任务
Stop a long nested loop task
我需要在用户按下转义键时停止来自 运行 的任务。问题是任务是 运行 一个像这样的方法:
void Start(){
while(long loop){
while(!userEvent) System.Windows.Forms.Application.DoEvents();
for(another long loop){
while(more loops)
}
}
}
我在浏览有关该主题的论坛时了解到,要使用 CancellationToken,您需要像这样处理它:
if (token.IsCancellationRequested)
{
// Clean up here, then...
"cleanup".Dump();
token.ThrowIfCancellationRequested();
}
由于循环太多,检查是否请求取消将非常低效且难读。
任务需要在 window 中的事件被读取时停止,所以我不能只在下一次迭代之前检查 CancellationToken,它几乎无处不在
那么,有没有办法在任务处于任何循环时停止它?
它不需要与 CancellationTokens 一起使用,但它似乎是 "standard" 执行此操作的方式。
此外,方法 Start() 最初并未用作任务,但这样做会使得即使在关闭 window 之后主线程仍保留 运行 代码,除非我使用了一堆同样不切实际的if (windowClosed) break
。
无论您处于多少个循环中,异常都会传播。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Escape:
cancallation.Cancel();
break;
}
}
private CancellationTokenSource cancallation = new CancellationTokenSource();
private void button1_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
while (...)
{
for (...)
{
cancallation.Token.ThrowIfCancellationRequested();
}
}
}, cancallation.Token);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (cancallation.IsCancellationRequested == false)
{
cancallation.Cancel();
}
}
这是 goto
语句的用例(参见 https://msdn.microsoft.com/en-us/library/13940fs2.aspx)。
void nestedExit()
{
while (true)
{
while (true)
{
while (true)
{
while (true)
{
while (true)
{
goto Done;
}
}
}
}
}
Done:
;
}
注意:分号是使该行成为一个语句所必需的。只有标签和右大括号无法编译。
我需要在用户按下转义键时停止来自 运行 的任务。问题是任务是 运行 一个像这样的方法:
void Start(){
while(long loop){
while(!userEvent) System.Windows.Forms.Application.DoEvents();
for(another long loop){
while(more loops)
}
}
}
我在浏览有关该主题的论坛时了解到,要使用 CancellationToken,您需要像这样处理它:
if (token.IsCancellationRequested)
{
// Clean up here, then...
"cleanup".Dump();
token.ThrowIfCancellationRequested();
}
由于循环太多,检查是否请求取消将非常低效且难读。
任务需要在 window 中的事件被读取时停止,所以我不能只在下一次迭代之前检查 CancellationToken,它几乎无处不在
那么,有没有办法在任务处于任何循环时停止它? 它不需要与 CancellationTokens 一起使用,但它似乎是 "standard" 执行此操作的方式。
此外,方法 Start() 最初并未用作任务,但这样做会使得即使在关闭 window 之后主线程仍保留 运行 代码,除非我使用了一堆同样不切实际的if (windowClosed) break
。
无论您处于多少个循环中,异常都会传播。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Escape:
cancallation.Cancel();
break;
}
}
private CancellationTokenSource cancallation = new CancellationTokenSource();
private void button1_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
while (...)
{
for (...)
{
cancallation.Token.ThrowIfCancellationRequested();
}
}
}, cancallation.Token);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (cancallation.IsCancellationRequested == false)
{
cancallation.Cancel();
}
}
这是 goto
语句的用例(参见 https://msdn.microsoft.com/en-us/library/13940fs2.aspx)。
void nestedExit()
{
while (true)
{
while (true)
{
while (true)
{
while (true)
{
while (true)
{
goto Done;
}
}
}
}
}
Done:
;
}
注意:分号是使该行成为一个语句所必需的。只有标签和右大括号无法编译。