私はWPFでウェブスクラップする方法を学んでいます。 20秒ごとにサイトをチェックし、検索結果に従ってObservableCollection(myClients)を更新し、Listview(myList)に表示します。私は2つのボタンを持っています、1つは検索を開始し、もう1つはそれを停止します。WPF、async/awaitの実装方法は?
ボタンオートクレークをX秒ごとに実装する方法はわかりませんでしたが(これは私のすべての問題を解決するものでしょうか?)、私はTask.Delay(20000)を使用しなければなりませんでした。プログラムは動作しますが、Thread.Sleep()を使用した場合のように開始時にはフリーズしませんが、Stopボタンを押してからStartを押すとすべてがフリーズします。
私は問題のように思われるコードの一部のみをアップロードします。私がまだ初心者であるので、現在のプログラム全体は、いくつかの異なるプログラムからリバースエンジニアリングされていることに注意してください。
private async void Button_Click(object sender, RoutedEventArgs e) //Start button
{
string car;
string price;
string link;
wantToAbort = false;
while (!wantToAbort)
{
// ----Simulate GET request----
//-----End GET----
myList.ItemsSource = myClients;
string searchCar = txtBlock.Text + " " + txtBlock2.Text;
var articleNodes = htmlDoc.DocumentNode.SelectNodes($"//*[@id='main_content']/div[1]/div[2]/ul[1]//*[text()[contains(., '{searchCar}')]]");
if (articleNodes != null && articleNodes.Any())
{
foreach (var articleNode in articleNodes)
{
car = WebUtility.HtmlDecode(articleNode.InnerText);
price = WebUtility.HtmlDecode(articleNode.ParentNode.ParentNode.SelectSingleNode("span").InnerText);
link = WebUtility.HtmlDecode(articleNode.ParentNode.ParentNode.Attributes["href"].Value);
var tempUser = new User(car, price, link);
if (!myClients.Any(x=>x.Link == tempUser.Link))
{
myClients.Insert(0, tempUser); //Inserts new item if Links are different
txtBlock3.Text = "Searching...";
}
}
await Task.Delay(20000); //This seems to be an issue
}
}
}
private void Button_Click_1(object sender, RoutedEventArgs e) //Stop button
{
wantToAbort = true;
txtBlock3.Text = "Ready to search again!";
}
なぜタイマを使用するだけではありませんか? – EJoshuaS
これまでは存在することが分かりませんでした(動作していたと思われる非同期ルートの開始)。それを今見てみましょう。 – CsharpNoob