使用计时器使用 C# VSTO 检查 Outlook 连接状态
Outlook connection status check with C# VSTO using timer
我正在编写一个程序,它应该检查 outlook 的连接状态,如果没有连接到服务器,则弹出一个在中间写入 exchangeconnectionstatus 值的表单对象。
所以,为此我写了这些
private bool error;
Form1 form1 = new Form1();
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
error = true;
this.Application.Startup += Application_Startup;
}
private void Application_Startup()
{
System.Threading.Timer timer = new System.Threading.Timer( _ => showForm(), null, 10000, 30000);
}
private void showForm()
{
if (Application.Session.ExchangeConnectionMode != Outlook.OlExchangeConnectionMode.olCachedConnectedFull && error)
{
error = false;
form1.setlabel(Application.Session.ExchangeConnectionMode.ToString());
form1.Show();
}
}
如果我在 application_startup 事件中调用 showForm 它工作正常。
但是如果我在每 30000 毫秒触发一次的计时器中调用 showForm,Form 对象显示但冻结。
这是照片
worked form object
这是 freezed form object
就是这样,希望我问你的问题很好。
我将不胜感激任何人知道这个“计时器事件冻结”的事情,或者可以显示另一种方法来检查 outlook 与 VSTO 或 addin
的连接状态
确保您使用 Forms 命名空间中的 Timer 对象,而不是 Threading 命名空间中的 - 它使用 Windows 消息并在主线程上触发。
终于解决了这种情况:
只需调用 ShowDialog();而不是 Show();
:D
我正在编写一个程序,它应该检查 outlook 的连接状态,如果没有连接到服务器,则弹出一个在中间写入 exchangeconnectionstatus 值的表单对象。
所以,为此我写了这些
private bool error;
Form1 form1 = new Form1();
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
error = true;
this.Application.Startup += Application_Startup;
}
private void Application_Startup()
{
System.Threading.Timer timer = new System.Threading.Timer( _ => showForm(), null, 10000, 30000);
}
private void showForm()
{
if (Application.Session.ExchangeConnectionMode != Outlook.OlExchangeConnectionMode.olCachedConnectedFull && error)
{
error = false;
form1.setlabel(Application.Session.ExchangeConnectionMode.ToString());
form1.Show();
}
}
如果我在 application_startup 事件中调用 showForm 它工作正常。 但是如果我在每 30000 毫秒触发一次的计时器中调用 showForm,Form 对象显示但冻结。
这是照片 worked form object 这是 freezed form object
就是这样,希望我问你的问题很好。 我将不胜感激任何人知道这个“计时器事件冻结”的事情,或者可以显示另一种方法来检查 outlook 与 VSTO 或 addin
的连接状态确保您使用 Forms 命名空间中的 Timer 对象,而不是 Threading 命名空间中的 - 它使用 Windows 消息并在主线程上触发。
终于解决了这种情况:
只需调用 ShowDialog();而不是 Show();
:D