CancellationToken.Register执行上下文

时间:2015-11-11 02:05:25

标签: c# async-await task-parallel-library

鉴于下面的代码段,我想确保当有人发出取消令牌来源 cts 时, win.Close()< / em>方法应该在_uiContext上下文中调用(之前捕获的GUI上下文)。

这是保证正确的方法吗?

CancellationTokenRegistration ctReg;
var tcs = new TaskCompletionSource<bool>();

var promise = Task.Factory.StartNew(async () =>
{
                var win = new UserView(tcs); // passed in

                win.DataContext = someViewModel;

                   ctReg= cts.Token.Register(() =>
                    {
                        win.Close(); // this should run in _uiContext

                    }, true);


                    win.Show();

                return await tcs.Task.ConfigureAwait(false);

  }, cts.Token, TaskCreationOptions.LongRunning, _uiContext).Unwrap();

1 个答案:

答案 0 :(得分:1)

是的,保证此回调将在捕获的上下文上运行,因为它已传递到StartNew并通过将true传递给Register来捕获。

然而,这非常复杂。您可以直接将该回调调用到更清晰的控件:

win.Dispatcher.Invoke(DispatcherPriority.Normal, () => win.Close());

注意:如果您在UI线程上安排该任务,TaskCreationOptions.LongRunning在这里有点无用。这主要用于安排默认TaskScheduler