2017-11-23 16 views
2

c#(Visual Studio)でいくつかのことを学ぶ簡単なアプリケーションを作ろうとしています。 今のところ私は音楽プレーヤーを構築していますが、そのうちの1つはボタンクリックイベントで音楽をフェードアウトしています。whileループ中にx秒間待つ#

フェードアウトの部分を作成するのに問題はありません。whileループを作成し、ループが実行されている時間ごとに1%の音量で音量を下げます。また、私はフェード値でラベルを更新します。

私は、Thread.Sleepイベントを使用しているフェードを遅くするために、その部分は私のアプリケーションをフリーズしているだけでなく、フェード値で自分のテキストラベルの更新をブロックしています。

フェーディングはうまくいきましたので、私が取り組むべき唯一の部分はいくつかの遅延を組み込むための別のオプションです。ここで私はタイマーについて読んだことがあり、Visual Studioにタイマーコンポーネントを追加しました。問題のみ、私はC#の新機能であり、このwhileループで正しく使用する方法を知らない。

誰でも私に助けてもらえますか?

現在のコードは次のとおりです。

private void BtnPodiumtune1Fadeout_Click(object sender, EventArgs e) 
    { 
     PlayerPodiumtune1.settings.volume = 100; 
     fade1 = 100; 
     while (fade1 != -1) 
     { 
      PlayerPodiumtune1.settings.volume = fade1; 
      Fadelevel1.Text = fade1.ToString(); 
      System.Threading.Thread.Sleep(30); 
      fade1 = fade1 - 1; 
     } 
     PlayerPodiumtune1.Ctlcontrols.stop(); 
    } 
+0

タイマーを使用している場合、whileループはありません – JohanP

+2

これはWinFormsアプリケーションですか? ['System.Windows.Forms.Timer'](https://msdn.microsoft.com/en-us/library/system.windows.forms.timer(v = vs.110).aspx)を使用します。 –

答えて

2

あなたはこのようなパターンの代わりに、タイマーを使用することができます。

private async void button_Click(object sender, EventArgs e) 
{ 
    if (Monitor.TryEnter(sender)) 
    { 
    int fade1 = 1000; 
    while (fade1 != -1) 
    { 
     await Task.Delay(30); 
     fade1--; 
    } 
    } 
} 

だから、送信者がボタンで、Monitor.TryEnterは、関数が実行されるまで再実行されてから機能を防ぎ:タイマーがちょうどそこに、このオプションを投げ、行くための細かい方法です。 asyncは、この関数が非同期に実行され、awaitに必要であることをフレームワークに通知します。 awaitは、タスクが完了するまでUIのスレッドの制御を返します。

PS - タイマーベースのソリューションでも再入場を防ぐために、Monitor.TryEnterのようなものが必要になります。

+1

@MickyD - 優秀で、それを知らなかった。編集されました。 – zzxyz

+0

あなたは良い先生です。 – MickyD

+0

ありがとう、Task.Delayの部分はトリックをしました:) –

-1

これは、C#でコンソールアプリケーションです:

using System; 

namespace WaitAsync 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      bool ok = false; 

      Console.Write("EnterTime (Seconds): "); 
      int time = Convert.ToInt32(Console.ReadLine()) * 1000; 

      while (ok != true) 
      { 
       System.Threading.Thread.Sleep(time); 
       ok = true; 
       Console.WriteLine("Waiting Time Just Finished"); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
関連する問題