2017-02-23 11 views
0

私はC#、Net4.0とVisual Studio 2010を使用していますが、ユーザーがボタンをクリックすると、Windowsフォームアプリケーションからこの動作を取得しようとしています:SAMEボタンのクリックイベント内のC#の開始と停止スレッド

時点2での動作は、LEDが

private void Btn_WebService_Click(object sender, EventArgs e) 
{ 
    Thread_Blink = new Thread(() => { LED_Blink(LED.WS); }); 
    Thread_Blink.Start(); 

    // Do something that takes time.. Let's imulate with a sleep 
    Thread.Sleep(2000); 

    Thread_Blink.Abort(); 
} 
点滅を停止終了する
  1. A GUI LEDは
  2. 長いラング操作が
  3. を開始点滅を開始します私はまた、3つの異なるイベント及び/又はタイマーを使用してみました

    ..

    private void Btn_WebService_MouseDown(object sender, MouseEventArgs e) 
    { 
        Timer_Blink.Enabled = true; 
    } 
    
    private void Btn_WebService_Click(object sender, EventArgs e) 
    { 
        // Do something that takes time.. Let's imulate with a sleep 
        Thread.Sleep(2000); 
    } 
    
    private void Btn_WebService_MouseUp(object sender, MouseEventArgs e) 
    { 
        Timer_Blink.Enabled = false; 
    } 
    

    結果は常に同じである:LEDは、長い運転操作(Thread.Sleep(2000);)の端部にのみ点滅し始め、突然STOPSあなたは何も見ることができません。なぜこれが起こり、どのようにして目的の動作を得ることができますか?

    さらに詳しい情報を追加します。 (LEDON(LED.WS);)TestWebServiceのは()私はオフLED得る実行されている間

    private void Btn_WebService_Click(object sender, EventArgs e) 
        { 
         BlinkWorker.RunWorkerAsync(LED.WS); 
         LedOn(LED.WS); 
    
         TestWebService(); // This method takes about 2 seconds to answer.. 
    
         LedOff(LED.WS); 
         BlinkWorker.CancelAsync(); 
        } 
    

    :私はBackgroundWorkedを使用しようと、このように希望behavourを実施しました。 TestWebService()が終了すると、LEDが点灯します。 Clickイベントの中で開始およびキャンセルされた場合でもBlinkWorkerは機能しません。

    FYI:点滅を開始するボタンとそれを停止するボタンを作成すると、完全に機能します。

答えて

0

BackgroundWorkerクラスとReportProgressメソッドを見てみることをお勧めします。

1

問題は、その中のUIスレッドを束縛していることです。Thread.Sleep UIスレッドは特別です。UIに変更を加えることができるのは唯一のスレッドなので、スリープ状態になっている間は、BackgroundWorkerまたはLED_BlinkタイマーコールバックからUI状態を変更しようとする試みを処理できません。

したがって、UIスレッドを縛る必要はありません。 Thread.Sleepコード(またはそれと実質的に同等のもの)をBackgroundWorkerDoWorkハンドラに入れるか、他の手段を使用してUIスレッドをブロックしないようにする必要があります。既にやろうとしている実際の作業は、非同期の代替手段を提供していますならば、今日

共通のアプローチはasync/awaitを利用することであろう(例えばawait Task.Delay(2000);は、現在のThread.Sleep(2000);の相当します)。残念ながら、asyncawaitを使用する場合は、.NET/Visual Studioのそれ以降のバージョンに移行する必要がありますが、とにかく考慮する必要があります。 2010年はかなり古くなっています(IMO、おそらく最悪のものですが、それは悪く遅いです)。そして.NET 4.0(.NET 4.5.2以降とは対照的)はもはやサポートされていません。

関連する問題