Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 带有等待任务的CancellationToken_Wpf_Task - Fatal编程技术网

Wpf 带有等待任务的CancellationToken

Wpf 带有等待任务的CancellationToken,wpf,task,Wpf,Task,我想在GUI中使用CancellationToken,但它不起作用。 当我点击取消按钮时,我想取消操作 this.tokenSource.Cancel(); 在其他地方,我有其他按钮,需要做主要的操作。主要部分包括Task和CancellationToken,这部分不起作用 private CancellationTokenSource tokenSource; private async void DataSynchronization(object notInUse) {

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


    }

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

这里有几个问题。首先,您不应该创建自己的
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,这只是一个循环。重要的部分是检查
标记和任务期间的一些方便点。如果更容易的话,还可以在令牌上注册回调。