2016-06-15 3 views
0

ボタンをクリックするたびにこのコードが呼び出されます。さて、Telnetを使っているので、Thread.Sleep()を追加しなければならなかったので、このメソッドは5〜7秒で実行されます。c#プログレスバーIsIndeterminateアニメーションがGUIスレッドでスタックされています

プログレスバーのアニメーションを同時に実行して、すべてがうまくいることをユーザーに知らせる方法があるかどうかは疑問でした。

ありがとうございました。

あなたがfalseにIsIndeterminateプロパティを設定し、プログレスバーのアニメーションを提供するために操作を通してプログレスバーの値を指定する必要があります
private void rack_Click(object sender, RoutedEventArgs e) 
      { 
       progressBar.IsIndeterminate = true; 

       // Extrait le nom du rack sélectionné 
       selectedRack = (sender as Button).Content.ToString().ToLower(); 

       // Console Update 
       console.Text += "Connexion en cours..."; 

       // Ouvre la connection au PDU 
       clientPDU = this.getConnectionPDU(); 

       // S'assure que la connection fut éffectué correctement 
       if (clientPDU != null) 
       { 
        // Disable les autres racks 
        for (int i = 65; i < 71; i++) 
        { 
         Button btn = (Button)FindName("rack_" + ((char)i)); 
         if (btn.Content.ToString().ToLower() != selectedRack) 
          btn.IsEnabled = false; 
        } 

        // Active Rafraichir et Déconnecter 
        refresh.IsEnabled = true; 
        disconnect.IsEnabled = true; 

        // Console Update 
        console.Text += "\nConnexion établie"; 

        // Mettre à jour les Port qui sont ouvert/fermé 
        this.getPortStatus(); 

        // Active les boutons en correspondance à ce qui est On et Off 
        this.setButtonStatus(); 
       } 
       else 
       { 
        // Console Update 
        console.Text += "\n\nConnexion Impossible. Veuillez réessayer...\n"; 
       } 

       // Scroll to end 
       scroller.ScrollToEnd(); 

       progressBar.IsIndeterminate = false; 
      } 
+0

UI以外のスレッドで 'Thread.Sleep()'を実行しますか? – Jai

+0

[async/await](https://blogs.msdn.microsoft.com/dotnet/2012/06/06/async-in-4-5-enabling-progress)の背後にある概念を理解すれば、これは非常に簡単に解決できます。 -and-cancellation-in-async-apis /)タスクを実行します。 async/awaitを使用すると、UIまたはプログレスバーをフリーズしているブロックスレッドを防ぐことができます。古いWinFormsアプリケーションで作業するときは、この方法を自分で使います。 – Arman

+1

'rack_Click'メソッドはUIスレッド上で実行されているので、このコードの実行中はどのUI要素も更新できません。実行中にUIを更新できるようにするには、バックグラウンドスレッドでこれを実行する必要があります。 – Enigmativity

答えて

0

progressBar.IsIndeterminate = false; 
// set the maximum for the progressBar 
progressBar.Maximum = 100; 
// do work and increment value 
progressBar.Value++; 

以下のページを持っていますIsIndeterminateプロパティがtrueに設定されたProgressBarの例と、アニメーションの外観を示す図(実際のユーザーのフィードバックは表示されません)。このページには、IsIndeterminateをfalseに設定した例もありますが、値を指定する必要があります。この例では、作業が実行されている間にUIのやり取りができるように、別のスレッドで作業が行われます。

http://www.wpf-tutorial.com/misc-controls/the-progressbar-control/

+0

これはasync/awaitのアプローチの良い代替手段です。それに従うことは簡単で、最小限のコードで問題に直接対処できます。 – Arman

+0

あなたが既に**あなたの答え**に入れているコンテンツをサポートしていない限り、外部リンクは避けるべきです。それ以外の場合は、リンクが壊れた場合、回答の価値が低下する可能性があります。 – Enigmativity

+0

私は外部リンクは避けるべきだと私は同意しますが、私の謙虚な意見では、これは私の答えの外部リンクが提供するものです(私の答えの内容をサポートしています)。明確にするために、私の答えでは、私はprogressBarコントロールにフィードバックをユーザに提供するために、 "IsIndeterminate"をfalseに設定しなければならないと述べています。提供された外部リンクは、IsIndeterminateがfalseに設定されている場合とtrueに設定されている場合の違いを(UIの観点から)示しています。 –

関連する問題