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"));
,我纔會收到通知,結果在那裏。
這是約。與編寫回調或背景工作者相同的工作量。
更新了我使用NotifyTaskCompletion類型的代碼片段。 – Gerard
'await'正在等待'TaskEx.Run'返回的任務。 'NotifyTaskCompletion'正在等待'GetModelAsync'返回的任務(只有當'GetModelAsync'返回時才完成)。 –
我明白了。當我使用'var task = TaskEx.Run(..);等待任務; <..> return task.Result;'我可以在'<..>'部分給propertychanges進行數據綁定。 'NotifyTaskCompletion'的優勢是什麼,因爲缺點是額外的回調? – Gerard