2011-12-07 11 views
17

SingletonWithTimerに含まれるDispatcherTimerが次のWPFアプリケーションで起動しない理由を理解しようとしています。私は数日間それを研究してきたし、底にそれを得るように見えることはできません。このアプリケーションは、私が修正しようとしている既存のアプリケーションの必要不可欠な部分です。このプロジェクトのスタートアップオブジェクトはWPFApplication5TimerTest.Programです。DispatcherTimerがWPFアプリケーションで起動しない

Timer is initialized 
'WpfApplication5TimerTest.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework.Aero\v4.0_4.0.0.0__31bf3856ad364e35\PresentationFramework.Aero.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
Sample thread 
Sample thread 
Sample thread 
Sample thread 
Sample thread 
Sample thread 
The thread '<No Name>' (0x10b0) has exited with code 0 (0x0). 
Sample thread exiting! 

これはProgram.csがある:次のように言葉「TIMERTICKは、」出力に表示されていないため

コンソールリストの出力は、問題が明らかである

using System; 

namespace WpfApplication5TimerTest 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      AppObject = new App(); 
      AppObject.Run(); 
     } 

     public static App AppObject 
     { 
      get; 
      private set; 
     } 
    } 
} 

これはApp.xaml.csです:

using System; 
using System.Threading; 
using System.Windows; 

namespace WpfApplication5TimerTest 
{ 
    public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      var sampleThread = new Thread(new ThreadStart(SampleThreadEntryPoint));    
      sampleThread.Start(); 
      new MainWindow().Show(); 
     } 

     private void SampleThreadEntryPoint() 
     { 
      SingletonWithTimer.Initialize(); 
      while (!_shutdownEvent.WaitOne(1000)) 
       Console.WriteLine("Sample thread"); 
      Console.WriteLine("Sample thread exiting!"); 
     } 

     protected override void OnExit(ExitEventArgs e) 
     { 
      _shutdownEvent.Set(); 
     } 

     private ManualResetEvent _shutdownEvent = new ManualResetEvent(false);   
    } 
} 

これはMainWindow.xですaml.cs:

using System; 
using System.Windows; 

namespace WpfApplication5TimerTest 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Closed(object sender, EventArgs e) 
     { 
      Program.AppObject.Shutdown(); 
     } 
    } 
} 

これはSingletonWithTimer.csです:

using System; 
using System.Windows.Threading; 

namespace WpfApplication5TimerTest 
{ 
    public class SingletonWithTimer 
    { 
     private static SingletonWithTimer Instance 
     { 
      get 
      { 
       if (_instance == null) 
       { 
        _instance = new SingletonWithTimer(); 
       } 
       return _instance; 
      } 
     } 

     public static void Initialize() 
     { 
      SingletonWithTimer.Instance._timer = new DispatcherTimer(); 
      SingletonWithTimer.Instance._timer.Interval = TimeSpan.FromSeconds(2); 
      SingletonWithTimer.Instance._timer.Tick += new EventHandler(SingletonWithTimer.Instance.OnTimerTick); 
      SingletonWithTimer.Instance._timer.Start(); 
      Console.WriteLine("Timer is initialized"); 
     } 

     private void OnTimerTick(object sender, EventArgs e) 
     { 
      Console.WriteLine("TimerTick"); 
     } 

     private static SingletonWithTimer _instance; 
     private DispatcherTimer _timer = null; 
    } 
} 

答えて

41

あなたが別の(非UI)スレッド上DispatcherTimerを作成したためです。したがって、UIスレッドのスレッドではなくスレッドのDispatcherスレッドに関連付けられます。そのスレッドでは何も実行されていないので、決して起動しません。

UIスレッドでDispatcherTimerを作成するか、Dispatcherを使用して渡すことができるconstructor overloadを使用します。

+7

例: '新しいDispatcherTimer(DispatcherPriority.Background、Application.Current.Dispatcher)' –

+0

@Kevin Kalitowski、優れた答えです。完璧に動作します。ありがとう! – Elangesh

関連する問題