Внедрение периодического процесса в UWP, MVVM - PullRequest
0 голосов
/ 07 октября 2018

Я создаю небольшое приложение, которое собирает данные с веб-сайта.и мне удалось собрать данные.

На следующем рисунке показано, что делает мое приложение.

enter image description here

, когда я нажимаю кнопку "시작"мое приложение получит 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; }
}

Я связываю data_list данные с viewPage, GridView.

Теперь я думаю, что могу сказать, что я хочу реализовать.

Если я нажимаю кнопку «시작» в моем приложении, я хочу запускать функцию щелчка каждые 20 секунд.

К счастью, я мог легко найти документ о периодической работе в UWP.Ссылка: create-a-period-work-item

Итак, я попытался реализовать эту функцию, но у меня не получилось.
Сначала я попробовал следующее:

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

public async void Regist()
{
    TimeSpan period = TimeSpan.FromSeconds(60);

    ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer(async (source) =>
    {
        Dispatcher.RunAsync(CoreDispatcherPriority.High,
            () =>
            {
                // UI components can be accessed within this scope.
                Click();
            });

    }, period);

}

public async void Click() //...omitted.. 

Я поместил Click() функцию в Dispatcher, потому что я думаю Click() вызов функции OnPropertyChanged() из INotifyPropertyChanged интерфейса.
, но Intellisense говорит мне, что он не может найти Dispatcherимя в контексте.
Так что я просто щелкнул правой кнопкой мыши по нему и щелкнул меню рефакторинга, а затем, Это предложение становится 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);

Но программа потерпела крах при выполнении функции Click добавить элемент в DataList List, я думаю, что другой поток (вид потока пользовательского интерфейса ...?) Наблюдает или удерживает этот список, когда я привязываю его к просмотруPage.И он возвращает исключение "Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)."

Как я могу периодически выполнять определенную функцию в UWP?

1 Ответ

0 голосов
/ 07 октября 2018

Вам необходимо использовать Dispatcher приложения (что соответствует диспетчеру главного окна):

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

Причина, по которой ваш подход не сработал, заключается в том, что невозможно вызвать Window.Current.Dispatcher изпоток не из пользовательского интерфейса, так как Window.Current доступен только в потоке пользовательского интерфейса.Однако к Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher можно получить доступ откуда угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...