CancellationToken等待任务

时间:2018-02-21 18:38:26

标签: wpf task

我想在我的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
                }
            );


    }

这是主要结构,但有些不对劲。我没有收到取消操作

1 个答案:

答案 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(); 发出信号,表示该操作已被取消,并且在您的任务中的任何位置,您将选择该操作并停止执行该操作。