Wpf 带有等待任务的CancellationToken
我想在GUI中使用CancellationToken,但它不起作用。 当我点击取消按钮时,我想取消操作Wpf 带有等待任务的CancellationToken,wpf,task,Wpf,Task,我想在GUI中使用CancellationToken,但它不起作用。 当我点击取消按钮时,我想取消操作 this.tokenSource.Cancel(); 在其他地方,我有其他按钮,需要做主要的操作。主要部分包括Task和CancellationToken,这部分不起作用 private CancellationTokenSource tokenSource; private async void DataSynchronization(object notInUse) {
this.tokenSource.Cancel();
在其他地方,我有其他按钮,需要做主要的操作。主要部分包括Task和CancellationToken,这部分不起作用
private CancellationTokenSource tokenSource;
private async void DataSynchronization(object notInUse)
{
this.tokenSource = new CancellationTokenSource();
CancellationToken ct = new CancellationToken();
ct.ThrowIfCancellationRequested();
await Task.Run(() =>
{
try
{
// do main operation
}
catch (Exception e)
{
}
finally
{
// final operation
}
if (ct.IsCancellationRequested)
{
ct.ThrowIfCancellationRequested();
}
}, this.tokenSource.Token)
.ContinueWith(
completedTaskResult =>
{
// I want to check if cancel was presed
}
);
}
这是主要结构,但有点不对劲。我没有收到取消操作这里有几个问题。首先,您不应该创建自己的
CancellationToken
,这就是CancellationTokenSource
的用途!这是你代币的来源。第二,您应该使用Run
重载,该重载将CancellationToken
作为第二个参数,第三,您需要检查CancellationToken.IsCancellationRequested
属性,以查看它是否已被取消,如果已取消,则停止正在执行的操作
请参阅以获取一个好的示例
因此,您的代码可能最终看起来像:
this.tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
await Task.Run(() =>
{
while(notDone && !token.IsCancellationRequested)
{
// do some stuff
}
}, token);
现在,当您这样做时:
this.tokenSource.Cancel()代码>
它将向相关的标记发出信号,表示操作已取消,您将在任务中的某个位置接收该操作并停止该操作。您能否提供示例?我是否理解正确,操作结束时应在任务中更新notDone?使用ContinueWith的最后一步是任务状态。取消了吗?@Leo,这只是一个循环。重要的部分是检查标记和任务期间的一些方便点。如果更容易的话,还可以在令牌上注册回调。