CancellationToken.注册执行上下文

本文关键字:上下文 执行 注册 CancellationToken | 更新日期: 2023-09-27 18:21:23

给定下面的代码片段,我想确保,当有人向取消令牌源发出信号cts时,win.Close()方法应该在_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();

CancellationToken.注册执行上下文

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

然而,这相当复杂。您可以直接在更清晰的控件上调用回调:

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

注意:如果您在UI线程上调度该任务,那么TaskCreationOptions.LongRunning在这里有些无用。这主要用于调度到默认TaskScheduler