考虑一下:
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...
}
为什么await之后任务还没有完成?
我一直认为异步等待模式的一大优点是:不必再编写回调!具有“正常程序”外观和感觉的异步编程。
但只有通过订阅 propertyChanged(this, new PropertyChangedEventArgs("Result"));
我才会收到结果存在的通知。
那是大约。与编写回调或后台工作程序的工作量相同。
最佳答案
您正在等待从 TaskEx.Run
返回的任务,但您没有设置 ModelAsync
据我所知。
假设ModelAsync
是 Task<Model>
,那么也许您的意思是:
async Task<Model> GetModelAsync()
{
ModelAsync = TaskEx.Run(...);
await ModelAsync;
// ModelAsync.IsCompleted is true here.
}
请注意Task
和Task<T>
不实现INotifyPropertyChanged
。如果您想要执行任务完成时更新的数据绑定(bind),请查看我的 NotifyTaskCompletion
type in the AsyncEx library .
关于c# - task.Status == RanToCompletion 和 task.IsCompleted 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141192/