鉴于下面的代码段,我想确保当有人发出取消令牌来源 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();
答案 0 :(得分:1)
是的,保证此回调将在捕获的上下文上运行,因为它已传递到StartNew
并通过将true
传递给Register
来捕获。
然而,这非常复杂。您可以直接将该回调调用到更清晰的控件:
win.Dispatcher.Invoke(DispatcherPriority.Normal, () => win.Close());
注意:如果您在UI线程上安排该任务,TaskCreationOptions.LongRunning
在这里有点无用。这主要用于安排默认TaskScheduler