C# 在UWP、MVVM中实现周期过程

C# 在UWP、MVVM中实现周期过程,c#,mvvm,uwp,scheduled-tasks,C#,Mvvm,Uwp,Scheduled Tasks,我正在构建一个从网站收集数据的小应用程序。我设法收集了数据 下图描述了我的应用程序的功能 当我点击按钮时“시작", 我的应用程序获取特定页面的html,并从中获取数据。这项工作在ViewModel类中完成,我将结果数据绑定到ViewPage,观察我认为的mvvm模式 下面的源代码显示了我为程序编写的逻辑 public class MainPageViewModel : Observable { public SiseDataList dataList { get; set; } =

我正在构建一个从网站收集数据的小应用程序。我设法收集了数据

下图描述了我的应用程序的功能

当我点击按钮时“시작", 我的应用程序获取特定页面的html,并从中获取数据。这项工作在ViewModel类中完成,我将结果数据绑定到ViewPage,观察我认为的mvvm模式

下面的源代码显示了我为程序编写的逻辑

public class MainPageViewModel : Observable
{

    public SiseDataList dataList { get; set; } = new SiseDataList();

    public MainPageViewModel()
    {
         ButtonClick = new RelayCommand(Click);
    }

    public async void Click()
    {
        // ... omitted .. 
        foreach (var i in tmp_list) 
        {
            if (dataList.Count == 0)
            {
                dataList.Add(i);
            }
            else if (dataList.Last().date < i.date)
            {
                dataList.Add(i);
            }
        }

        OnPropertyChanged("data");
    }
    public RelayCommand ButtonClick { get; set; }
}
我将
Click()
函数放在
Dispatcher
中,因为我认为
Click()
函数调用
OnPropertyChanged()
来自
INotifyPropertyChanged
接口。
但是Intellisense告诉我,它在上下文中找不到任何
调度程序
名称。
所以我只需右键单击它并单击重构菜单,然后,这句话就变成了
System.ServiceModel.Dispatcher.RunAsync…

但它不起作用。我在文档中找到了
CoreDispatcher
类,所以我使用了它。我编写了
CoreDispatcher.RunAsync(..)
,但它不是一个静态类,我不能使用这种语法

我在谷歌上搜索并尝试了
Window.Current.Dispatcher.RunAsync(..)
,但它返回异常“
Windows.UI.Xaml.Windows.Current.get
返回
null

最后,我尝试了以下代码

 TimeSpan period = TimeSpan.FromSeconds(60);

 ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((source) =>
 {
     Click();
 }, period);
但程序在执行<代码>单击<代码>函数dataList中的add element时崩溃,我想其他线程(UI线程的种类…?)正在监视或持有该列表,因为我将其绑定到查看页面。它返回异常“来自HRESULT的异常:0x8001010E(RPC_E_错误_线程)。”


如何在UWP中定期执行特定功能?

您需要使用应用程序的
调度程序
(与主窗口的调度程序匹配):


您的方法不起作用的原因是无法从非UI线程调用
Window.Current.Dispatcher
,因为
Window.Current
只能在UI线程上访问。但是
Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher
可以从任何地方访问。

Hi,作为您的命令nt,我使用了
System.Windows.Application.
。但Intellisense告诉我,在
System.Windows
命名空间中,
Application
命名空间不存在。我的应用程序有什么问题?我很尴尬。我将您的源代码粘贴到
ThreadPoolTimer PeriodicTimer=ThreadPoolTimer.CreatePeriodicTimer((源代码)=>{///此处//},句点);
在viewmodel部分抱歉,我的错误:-D!!名称空间是Windows.UI.Xaml,我不小心使用了WPF。我用正确的代码更新了答案哦,天哪,我又一次完全错了…太晚了,应该睡觉了:-D。获取调度程序的正确方法是Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync()。请检查更新后的答案:-)再次更新了代码,希望是最后一次!对于所有的困惑,我深表歉意谢谢,我与您的源代码一起解决了。我有一些问题要问您。首先,我想知道您是如何知道答案的。其次,我发现我编写了
Windows.ApplicationModel.Core.CoreApplication.MainView.Dispatcher.RunAsync(…)
,但它也可以工作。它是如何工作的。谢谢你的好意。^^b…拇指朝上可能不需要显式地拨打调度电话。只需使用一个。
 TimeSpan period = TimeSpan.FromSeconds(60);

 ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((source) =>
 {
     Click();
 }, period);
Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
        CoreDispatcherPriority.High,
        () =>
        {
            // UI components can be accessed within this scope.
            Click();
        });