まず、オブジェクトがnullかどうかをチェックしたいと思います。 whileループでは20ミリ秒間スリープし、ユーザーはUIで対話できます。C#でThread.Sleepを使用しているときにボタンをクリックできません。
whileの条件が正しい場合は、UIのボタンをクリックしてこのループを解除し、他のコードを続行できます。 Iを用いて試みた
while (browser.FindElementById("iframe") == null)
{
if(buttonWasClicked == true)
return;
Thread.Sleep(20);
}
:私は元のコードによってで試み
Task.Delay(10000).ContinueWith(x =>
{
while (browser.FindElementById("iframe") == null)
{
if(buttonWasClicked == true)
return;
}
});
はバックグラウンドで作動ブロックコードに見えます。したがって、ブロックコードをスキップし、次のすべての行コードを実行します。
次のコードを実行する前に確認する必要があります。
私は別の方法で試しました。私はTimer
を使用していますが、アプリケーションでは通常Timer
を使用しません。私はこれに関する経験はありません。
のように新しいTimer
を作成し、interval = 20
と設定しました。 timer1_Tick
イベントで
、私はコードを追加します
timer1.Stop();
:私はに設定され、button_Clicked
イベントで
timer1.Start();
:
private void timer1_Tick(object sender, EventArgs e)
{
if (browser.FindElementById("iframe") == null)
{
if(buttonWasClicked == true)
break;
}
else
timer1.Stop();
}
そして、元のコードでは、私はと交換します。
私のコードに問題がありますか?
デバッグでは、イベントtimer1_Tick()
をスキップし、timer.Start()
の行の後にすべてのコードを実行します。
.NETには、すべてのUI処理を行うUIスレッドが1つしかありません。スリープ状態でフリーズすると、イベントを処理できなくなり、UIが応答しなくなります。次に、追加したWinFormsのTimerもUIスレッドでイベントを発生させ、再びハンドラ内でスリープしないようにします。 – Groo
@Grooこれを行うには2つの方法があります。 'Timer'または' BackgroundWorker'を使用しています。しかし、「BackgroundWorker」は私のシナリオには適していないようです。 – vanloc
'timer1.Start()'はスレッドをブロックしません。タイマーに20ms後にイベントを発生させるように指示します。 'timer.Start()'の後のコードは引き続き実行されます。だから、あなたが達成しようとしていることが本当にはっきりしないのですが、 'timer.Start()'の後のすべてのコードが 'iframe'を見つけたら実際に実行するはずです。次に、このコードを別のメソッドに移動し、 'iframe'を見つけたらそれをタイマーハンドラから呼び出します。 – Groo