【问题标题】:Async/await On Property Changed异步/等待属性更改
【发布时间】:2014-05-27 10:07:18
【问题描述】:

我正在寻找异步/等待中的一些最佳实践。 我有 datepicker 和 observable 集合,我想在 datetime 异步更改时将数据加载到 observable 集合中。 我怎样才能很好地修改我的代码来做到这一点?我知道,属性不能是异步的。我知道命令,所以也许我需要在 datepicker datetimechanged 事件上绑定异步命令?

public class LogViewModel : ViewModelBase
{
    public LogViewModel()
    {
        LogCollection = new ObservableCollection<Log>();
        DateTime = DateTime.Now.Date;
    }

    private DateTime _dateTime;

    public DateTime DateTime
    {
        get { return _dateTime; }
        set
        {
            if (_dateTime != value)
            {
                _dateTime = value;
                LogCollection.Clear();

                //long running code begins
                using (var ctx = new DataContext())
                {
                    ctx.Logs.Where(p => p.dt >= _dateTime && p.dt < _dateTime.AddDays(1))
                        .ToList().ForEach(z => LogCollection.Add(z));
                }
                RaisePropertyChanged("DateTime");
            }
        }
    }

    public ObservableCollection<Log> LogCollection { get; set; }
}

【问题讨论】:

    标签: .net asynchronous async-await viewmodel


    【解决方案1】:

    我认为最好的做法是让 VM 和类似的类保持清晰。所以我更喜欢在内部订阅 PropertyChanged 事件并将此类逻辑移动到事件处理程序(重构友好示例):

    public LogViewModel()
    {
        if (!DesignerProperties.IsInDesignTool)
        {
            PropertyChanged += HandlePropertyChanged;
        }   
    }       
    
    private static string DateTimePropertyName = ExpressionHelper.NameOf((LogViewModel _) => _.DateTime);
    
    private void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == DateTimePropertyName)
        {
            //Start async operation in other thread via TPL Tasks/ThreadPool's QueueUserWorkItem etc. for example or using true-async IO operations (a bunch of real-async operations available in EF)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2016-07-07
      • 2016-03-25
      • 2017-10-09
      相关资源
      最近更新 更多