2015-11-11 41 views
1

,我想確保,當有人在信號取消標記源CTS,則win.Close()方法應在_uiContext被稱爲上下文(前面捕獲的GUI上下文)。CancellationToken.Register考慮下面的代碼片段執行上下文

這是保證正確的方法嗎?

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

什麼是_uiContext? – i3arnon

+0

它是先前保存捕獲的UI上下文的變量(TaskScheduler.FromSynchronizationContext()) – alpinescrambler

回答

1

是的,這是保證,因爲它傳遞給StartNew,並通過將trueRegister捕獲在這個回調將在拍攝的上下文中運行。

但是,這很複雜。您可以調用回調直到控制,更清晰:

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

注:​​有點沒用這裏,如果你要安排在UI線程上的任務。這通常用於安排到默認時TaskScheduler

相關問題