2014-01-15 87 views
0

的Comparence考慮一下:task.Status == RanToCompletion和task.IsCompleted

readonly INotifyTaskCompletion<Model> _modelAsync; 
public INotifyTaskCompletion<Model> ModelAsync { get { return _modelAsync; } } 
public ctor() // pseudo code 
{ 
    _modelAsync = NotifyTaskCompletion.Create(GetModelAsync()); 
    _modelAsync.PropertyChanged += modelAsync_Ready; 
} 
async Task<Model> GetModelAsync() 
    { 
     var rv = await TaskEx.Run(new Func<Model>(() => Agent.GetModel()); 
     if (ModelAsync.IsSuccessfullyCompleted) Trace.WriteLine("after await completed"); 
     if (ModelAsync.Status != TaskStatus.RanToCompletion) Trace.WriteLine("after await not completed"); 
     if (ModelAsync.Result != null) Trace.WriteLine("after await result"); 
     if (ModelAsync.Result == null) Trace.WriteLine("after await no result"); 
     return rv; 
} 
void modelAsync_Ready(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Result") { }// etc... 
} 

爲什麼該等待任務之後尚未完成?
我一直認爲異步等待模式的優點是:不必再寫回調了!異步編程與「正常程序」的外觀和感覺。

但只有通過訂閱propertyChanged(this, new PropertyChangedEventArgs("Result"));,我纔會收到通知,結果在那裏。
這是約。與編寫回調或背景工作者相同的工作量。

回答

2

您正在等待從TaskEx.Run返回的任務,但您並未設置ModelAsync,就我所見。

假設ModelAsyncTask<Model>,那麼也許你的意思是:

async Task<Model> GetModelAsync() 
{ 
    ModelAsync = TaskEx.Run(...); 
    await ModelAsync; 
    // ModelAsync.IsCompleted is true here. 
} 

注意TaskTask<T>沒有實現INotifyPropertyChanged。如果你想做任務完成時更新的數據綁定,請查看我的NotifyTaskCompletion type in the AsyncEx library

+0

更新了我使用NotifyTaskCompletion類型的代碼片段。 – Gerard

+0

'await'正在等待'TaskEx.Run'返回的任務。 'NotifyTaskCompletion'正在等待'GetModelAsync'返回的任務(只有當'GetModelAsync'返回時才完成)。 –

+0

我明白了。當我使用'var task = TaskEx.Run(..);等待任務; <..> return task.Result;'我可以在'<..>'部分給propertychanges進行數據綁定。 'NotifyTaskCompletion'的優勢是什麼,因爲缺點是額外的回調? – Gerard

相關問題