c# - task.Status == RanToCompletion 和 task.IsCompleted 的比较

标签 c# async-await inotifytaskcompletion

考虑一下:

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据我所知。

假设ModelAsyncTask<Model> ,那么也许您的意思是:

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

请注意TaskTask<T>不实现INotifyPropertyChanged 。如果您想要执行任务完成时更新的数据绑定(bind),请查看我的 NotifyTaskCompletion type in the AsyncEx library .

关于c# - task.Status == RanToCompletion 和 task.IsCompleted 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141192/

相关文章:

c# - 使用 StreamReader 和 Readline() 为文件生成 MD5 值

c# - 在以下情况下,我应该使用线程安全集合吗?

c# - 任务未返回 IsCompleted 状态

javascript - javascript 中的 await 关键字会降低应用程序的速度吗?

node.js - AWS Lambda 不适用于 `async` ,仅适用于回调?

c# - 以可等待的方式等待 INotifyTaskCompletion 属性的结果?

c# - 无法加载文件或程序集 'Microsoft.AspNet.Scaffolding.12.0'

c# - 如何更改列表框的突出显示颜色