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