2016-08-03 4 views
0

まず、オブジェクトが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()の行の後にすべてのコードを実行します。

+5

.NETには、すべてのUI処理を行うUIスレッドが1つしかありません。スリープ状態でフリーズすると、イベントを処理できなくなり、UIが応答しなくなります。次に、追加したWinFormsのTimerもUIスレッドでイベントを発生させ、再びハンドラ内でスリープしないようにします。 – Groo

+0

@Grooこれを行うには2つの方法があります。 'Timer'または' BackgroundWorker'を使用しています。しかし、「BackgroundWorker」は私のシナリオには適していないようです。 – vanloc

+1

'timer1.Start()'はスレッドをブロックしません。タイマーに20ms後にイベントを発生させるように指示します。 'timer.Start()'の後のコードは引き続き実行されます。だから、あなたが達成しようとしていることが本当にはっきりしないのですが、 'timer.Start()'の後のすべてのコードが 'iframe'を見つけたら実際に実行するはずです。次に、このコードを別のメソッドに移動し、 'iframe'を見つけたらそれをタイマーハンドラから呼び出します。 – Groo

答えて

1

"wait for button push"コードがGUIスレッド内にあると仮定すると、これはawaitの場合のように見えます。待つことができるイベント(manualまたはauto)を作成し、その代わりにbuttonWasClickedを使用することを検討してください。あなたがメインのコードは、その後、次のようになります。あなたがevtButtonClicked.Set()を呼び出すとき

evtButtonClicked = new AsyncManualResetEvent(); 

await evtButtonClicked.WaitAsync(); 

// continuation code... 

、継続コードは、GUIのスレッドで実行するまでキューに入れられます。 awaitの後のコードが効果的にTask.ContinueWith()にラップされていることを思い出してください。これは、イベントを待っている間にGUIスレッドがブロックされないことを意味します。

関連する問題