2011-12-29 13 views
1

C#を使用してWindows Phoneアプリケーションを作成しようとしています。 1つの画像を100ミリ秒間表示し、別の画像に切り替えるタイマーを設定してから、もう一度画像が点滅するまでにもう一度900ミリ秒待機します。私は以下のコードを書いていますが、一貫して点滅するようには見えません。何か案は?Windows Phoneタイマー間隔に一貫性がない

public partial class MainPage : PhoneApplicationPage 
{ 
    DispatcherTimer timer = new DispatcherTimer(); 
    List<string> files = new List<string>() { "Images/off-light.png", "Images/on-light.png" }; 
    List<BitmapImage> images = new List<BitmapImage>(); 
    int current = 0; 

    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 

     foreach (string file in files) 
     { 
      BitmapImage image = new BitmapImage(new Uri(file, UriKind.Relative)); 
      images.Add(image); 
     } 


      timer = new DispatcherTimer(); 
      timer.Interval = TimeSpan.FromMilliseconds(900); 
      timer.Tick += new EventHandler(timer_Tick); 

    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     myImage.Source = images[current]; 
     current++; 
     if (current >= files.Count) 
     { 
      current = 0; 
      timer.Interval = TimeSpan.FromMilliseconds(100); 
      timer.Stop(); 
      timer.Start(); 
     } 
     else 
     { 
      timer.Interval = TimeSpan.FromMilliseconds(900); 
      timer.Stop(); 
      timer.Start(); 
     } 

    } 

    private void btnStop_Click(object sender, RoutedEventArgs e) 
    { 
     timer.Stop(); 
     myImage.Source = images[0]; 
    } 

    private void btnStart_Click(object sender, RoutedEventArgs e) 
    { 
     timer.Start(); 
    } 
} 
+0

この場合、「一貫性がない」とはどういう意味ですか?イメージは一度フラッシュした後、もう一度フラッシュしませんか?それは100ミリ秒より長いか短いか?また、操作の順序を変更することも考えられます。タイマーを停止し、間隔を設定してから、タイマーを再起動します。正直言っても、私はあなたが停止/再起動せずに間隔を設定できると思います。 –

+0

イメージが表示されるタイミングが本当に100msではなく、真に900ms毎に待たないという点で一貫していません。私は停止して再起動することなく間隔を設定しようとします。 – zaber76

+0

実際には何かが正しくないことに気がつくところは、このコードブロックにクリックタイプのmp3ファイルを再生するための行を置いた場合です:if(current> = files.Count) { current = 0; timer.Interval = TimeSpan.FromMilliseconds(100); timer.Stop(); timer.Start(); } 「クリック」という音が連続して複数回聞こえることがあります。しかし間違いなく一貫しています。複数のタイマーがあるように聞こえる。 – zaber76

答えて

0

私はリサイズ/ WPF/Silverlightの男のあまりないんだけど、私はあなたがあなたのウィンドウを無効にする必要があると思います。私はリフレッシュにトリガされません元画像を変更思うだろうような方法は、レンダリングをリフレッシュするために必要なものは何でも

コール

3

DispatchTimerドキュメントは言う:

タイマーを実行するために保証されていません

正確には時間間隔が発生するが、時間間隔が生じる前には実行されないことが保証される。これは、DispatcherTimer操作が他の操作と同様にDispatcherキューに置かれるためです。 DispatcherTimer操作が実行されるとき、キュー内の他のジョブとその優先順位に依存します。

DispatchTimerと一緒に働いたことがないので、それが問題を引き起こしているのかどうかわかりません。

タイマーには他にもオプションがあります。たとえば、System.Timers.TimerまたはSystem.Threading.Timerを使用できます(これはSystem.Timers.Timerを推奨します)。ただし、これらのタイマーのいずれかを使用すると、プールスレッドでコールバックが実行され、UIスレッドへのアクセスを同期させる必要があることに注意してください。再びDispatchTimerドキュメントから:

でSystem.Timers.TimerがWPFアプリケーションで使用される場合、でSystem.Timers.Timerは、ユーザインタフェース(UI)スレッド別のスレッド上で実行されることは注目に値します。ユーザーインターフェイス(UI)スレッド上のオブジェクトにアクセスするには、InvokeまたはBeginInvokeを使用して、ユーザーインターフェイス(UI)スレッドのディスパッチャに操作を送信する必要があります。 System.Timers.Timerとは逆のDispatcherTimerを使用する理由は、DispatcherTimerがDispatcherと同じスレッドで実行され、DispatcherPriorityがDispatcherTimerで設定できることです。

タイマーの優先度を高くすることを検討してください。

関連する問題