【发布时间】:2018-10-31 01:40:17
【问题描述】:
在我的应用程序中,我运行了一个执行繁重操作的Task,我试图停止执行该Task。实际上我在课堂上声明了以下结构:
public class Foo
{
private CancellationTokenSource tokenSource = new CancellationTokenSource();
private CancellationToken token;
public void Start()
{
var task = new Task(async () => {
try
{
await new Bot().StartAsync(token);
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}, token));
task.Start();
}
}
如您所见,我声明了一个CancellationTokenSource,它允许我在用户单击按钮时停止任务执行:
StopTask_Click(object sender, EventArgs e)
{
tokenSource.Cancel();
}
现在,在 StartAsync 方法中,我有以下代码:
public async Task StartAsync(CancellationToken token)
{
ApplicationToken = token;
while(true)
{
if(ApplicationToken.IsCancellationRequested)
{
break;
}
}
}
ApplicationToken 将作为参数传递的令牌存储在StartAsync 方法的类中。
在按钮点击事件之后,请求应该被取消但没有任何反应。
然后我检查每次迭代是否有取消请求,但变量值甚至是false。
【问题讨论】:
-
您可能需要澄清问题的标题。由于
CancellationToken是struct,它不能是null。 -
我猜你传递的是不同的令牌。为什么不在
Foo类中创建Cancel方法。所以要取消任务只需调用foo.Cancel();BTW 我在这里看不到StartAsync的实现和Foo类之间的关系。 -
@Luthfay
StartAsync方法是另一个类的一部分,Foo类只声明了一个包含繁重操作的Task -
抱歉,没看到……
-
“重操作”是什么意思?不管
while循环中发生了多少事情,在循环循环之前它肯定不会检查取消。