Я создаю небольшое приложение, которое собирает данные с веб-сайта.и мне удалось собрать данные.
На следующем рисунке показано, что делает мое приложение.
, когда я нажимаю кнопку "시작"мое приложение получит 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?