我有一个控制台应用程序需要触发使用 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;
}
}