Wpf 异步任务中的ObservableCollection AddRange

Wpf 异步任务中的ObservableCollection AddRange,wpf,async-await,task,observablecollection,Wpf,Async Await,Task,Observablecollection,嗨,我想在异步任务中使用ObservableCollection(AddRange),但我得到了NotSupportedException private ObservableCollection<CoronavirusCountry> _data = new ObservableCollection<CoronavirusCountry>(); public ObservableCollection<CoronavirusCountry> d

嗨,我想在异步任务中使用ObservableCollection(AddRange),但我得到了NotSupportedException

private ObservableCollection<CoronavirusCountry> _data = new ObservableCollection<CoronavirusCountry>();
        public ObservableCollection<CoronavirusCountry> data
        {
            get => _data;
            set => SetProperty(ref _data, value);
        }

Task.Run(async()=>{
   APIService service = new APIService();
            data.AddRange(await service.GetTopCases());
            Status = "Updated " + DateTime.Now;

});
private observetecollection\u data=new observetecollection();
公共可观测收集数据
{
获取=>\u数据;
set=>SetProperty(参考数据,值);
}
Task.Run(异步()=>{
APIService=新的APIService();
AddRange(wait service.GetTopCases());
Status=“Updated”+DateTime.Now;
});

不确定您指的是哪个
AddRange
方法,因为ObservableCollection没有现成的方法

无论如何——假设您编写了一个扩展方法——它必须在UI线程中调用,因此运行任务没有意义

下面所示的等待方法应该足够了。它将等待异步服务调用,并在主线程中更新集合

public async Task UpdateData()
{
    var service = new APIService();
    var newData = await service.GetTopCases();

    Data.AddRange(newData); // use proper naming!

    Status = "Updated " + DateTime.Now;
}

为了调用并等待上述方法,可以使用异步加载的事件处理程序,如下所示:

public MainWindow()
{
    InitializeComponent();

    viewModel = new ViewModel();

    Loaded += async (s, e) => await viewModel.UpdateData();
}

这回答了你的问题吗@PeterDuniho谢谢,我怎样才能将这个扩展与addrange一起使用?谢谢,但我需要在ctor中调用这个方法,我听说如果我调用
UpdateData().Wait())
导致死区,这就是为什么我想在任务中执行代码。您不能在构造函数中调用可等待的方法,而且您创建的任务也必须等待。如果您指的是UI元素的构造函数,例如窗口或用户控件,请在异步加载的事件处理程序中调用它。我的构造函数在viewmodel(prism mvvm)中