3

System.Windows.Forms.Timerを使用して、作成中の Excel アドインの UI スレッドでイベントが発生するようにしたいと考えています。次のようにタイマーを作成します。

private System.Windows.Forms.Timer _timer;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    Debug.WriteLine("ThisAddIn_Startup:" + Thread.CurrentThread.ManagedThreadId);

    _timer = new System.Windows.Forms.Timer();
    _timer.Tick += new EventHandler(TimerEventHandler);
    _timer.Interval = 500;            
}

タイマーは、使用しているライブラリの COM イベントによって起動されます。

private void OnEvent()
{
    _timer.Start();
}

_timer次に、ティック時に次のメソッドを呼び出すことを期待しています。

public void TimerEventHandler(object sender, EventArgs args)
{
    _timer.Stop();
    Debug.WriteLine("Tick: " + Thread.CurrentThread.ManagedThreadId);                  
}

私が理解しているように、アドインスレッドでタイマーを作成すると、別のスレッド (この場合は COM イベント) から開始されても、作成されたスレッド、つまりアドインスレッドで起動する必要があります。ただし、これは起こりません。

私はこの正確なメカニズムをRTDServer私が過去に書いたもの ( Kenny Kerr によって概説されているように)に実装しました_timer

同じ動作を指摘している他の SO 記事も読みましたが、アドインの設定の違いがわかりません。

編集: OnEvent() メソッドが起動されます。

4

3 に答える 3

5

winforms タイマーはコントロールであり、フォームに配置して使用する必要があります。コントロールコレクションに追加することはないので、適切に機能するとは思いません。ドキュメントには次のように書かれています

ユーザー定義の間隔でイベントを発生させるタイマーを実装します。このタイマーは、Windows フォーム アプリケーションでの使用に最適化されており、ウィンドウで使用する必要があります。

したがって、System.Timers.Timer クラスのインスタンスを使用することをお勧めします。このクラスはどこでも使用できます。

上記で使用したTick-eventは、 System.Timer.Timer クラスの別の名前、つまりElapsed-eventで呼び出されることに注意してください。

于 2013-08-20T05:48:14.590 に答える