COM を使用するメソッドを起動する必要があるコンソール アプリケーションがあります。プログラムは [STAThread] で始まります。プログラムは、タイマー プロセスを使用していない場合は正しく実行されますが、タイマーを使用している場合はコンソールへのブロックが発生するようです。
System.Threading.Timer と System.Timers.Timer を使用しましたが、どちらも機能しませんでした。現在、COM を使用するメソッド (Transmit()) を呼び出すスレッドを追加しました。Console.Readline でメイン スレッドをクリアすると、プログラムは COM オブジェクトがブロックされた場所から再開しますが、もちろんプログラムは終了し、必要なタイマー機能が失われます。
コンソール アプリケーションを使用しているときに、SynchronizingObject を設定して ISynchronizeInvoke コールバックを取得する方法がわかりませんでした。
複数のスレッドを探しているわけではありません。Transmit メソッドを定期的に呼び出して、コンソールに結果を返しながら COM を操作する必要があるだけです。
class Program
{
private static System.Timers.Timer transTimer;
[STAThread]
static void Main(string[] args)
{
transTimer = new System.Timers.Timer();
transTimer.Enabled = true;
transTimer.Interval = 6000;
transTimer.Elapsed += new System.Timers.ElapsedEventHandler(transTimer_Elapsed);
transTimer.Start();
Console.ReadLine();
transTimer.Dispose();
return;
}
static void transTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (transTimer.Enabled)
{
transTimer.Enabled = false;
Thread thread = new Thread(Transmit);
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start();
thread.Join(); //Wait for the thread to end
transTimer.Enabled = true;
}
}