我想在我的GUI中使用CancellationToken但它不起作用。 当我点击取消按钮时,我想取消操作
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
}
);
}
这是主要结构,但有些不对劲。我没有收到取消操作
答案 0 :(得分:1)
这里有几个问题。首先,您不应该创建自己的CancellationToken
,这就是CancellationTokenSource
的用途!它是令牌的源。其次,您应该使用以Run
作为第二个参数的CancellationToken
重载,第三,您需要检查CancellationToken.IsCancellationRequested
中的do main operation
属性,看看它是否属于this.tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
await Task.Run(() =>
{
while(notDone && !token.IsCancellationRequested)
{
// do some stuff
}
}, token);
已取消,停止正在做的事情如果是。
请参阅here以获得一个好例子。
所以你的代码可能最终看起来像:
this.tokenSource.Cancel();
现在你做的时候:
Token
它会向关联的String query = "{CALL aaa.package_name.zapisz_button(?,?,?)}" ;
CallableStatement cst = con.prepareCall(query);
cst.setString(1,txtNazwa.getText());
cst.setString(2, "test");
cst.setString(3,txtLiczba.getText());
cst.execute();
cst.close();
发出信号,表示该操作已被取消,并且在您的任务中的任何位置,您将选择该操作并停止执行该操作。