任务在取消后转到ContinueWith之前返回结果

时间:2015-12-22 08:59:47

标签: c# wpf task-parallel-library

至于标题我遇到了一个问题,即在调用.ContinueWith操作之前将一些结果返回给调用者,以防任务被取消(否则一切都很好)

您可以找到有问题的代码:

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

WaitWindow waitWindow = new WaitWindow(ServerName, DeviceName, cts);
waitWindow.Loaded += (sender, args) =>
{
    Task.Factory.StartNew<bool>(() =>
    {
        while(true) {
            //Do some work that returns true or false
            //and set waitWindow.ErrorMessage with a specific string
        }

    }, token).ContinueWith((antecedent) =>
    {
        Application.Current.Dispatcher.Invoke(() =>
        {
            if (antecedent.IsCanceled)
            {
                waitWindow.ErrorMessage = "Search aborted";
                waitWindow.DialogResult = false;
            }
            else
            {
                waitWindow.DialogResult = antecedent.Result;
            }
            waitWindow.Close();
        });
    });
};
waitWindow.ShowDialog();

DeserializeResult dr = new DeserializeResult((bool)waitWindow.DialogResult, waitWindow.ErrorMessage);

return dr;

这个想法是在程序尝试连接到服务器/设备时显示一个带有不确定进度条和取消按钮的窗口。 可能的结果是找到服务器/设备,在预定义的时间量e之后超时并且用户取消搜索。 前两个案例运作良好,而最后一个案例没有,正如我所写,它在继续执行ContinueWith中的代码之前进入“return dr”行。

我已经尝试过各种各样的设置组合,既可以完成任务,也可以继续进行,但没有运气......

我做错了什么?有任何想法吗? 如果您需要更多信息,我将非常乐意给予他们。

更新 我注意到第一次调用(和取消)任务时它没有进入ContinueWith,而第二次进入“return dr”后两次(两个时间都是antecedent.IsCanceled为false)。 ..我绝对不明白为什么......

更新2 也许它并不重要,但我修改了我的伪代码,以澄清该任务包含一个无限循环,意味着以上述三种情况之一结束

0 个答案:

没有答案