我遇到一个问题,如果我的应用程序忙于/没有响应/暂停一个断点,它会导致outlook停止,即使我的邮件收到事件处理程序早已返回。
我整理了一个小测试用例:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Office.Interop.Outlook;
namespace OutlookPerfTest
{
class Program
{
private static Application app;
private static NameSpace ns;
static void Main(string[] args)
{
Type olType = Type.GetTypeFromProgID("Outlook.Application", false);
app = Activator.CreateInstance(olType) as Application;
ns = app.GetNamespace("MAPI");
ns.Logon(null, null, false, false);
app.NewMailEx += app_NewMailEx;
for (; ; )
{ Thread.Sleep(10000); }
}
static void app_NewMailEx(string EntryIDCollection)
{
Console.WriteLine("New mail event triggered, running on background worker...");
var bg = new BackgroundWorker();
bg.DoWork += bg_DoWork;
bg.RunWorkerAsync(EntryIDCollection);
Console.WriteLine("New mail event ended, returning");
}
static void bg_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(5000);
Console.WriteLine("New mail thread started");
string EntryIDCollection = (string)e.Argument;
foreach (var id in EntryIDCollection.Split(','))
{
if (ns.GetItemFromID(id) is MailItem)
{
Console.WriteLine(id + " is a mail item");
}
}
Console.WriteLine("New mail thread Ended");
}
}
}
在Thread.Sleep(5000);
展望期间,我们仍然感到高兴和敏感。在调用以下Console.WriteLine
时,原始app_NewMailEx
事件处理程序早已返回。
但是,如果我在该行上断点,或以其他方式锁定我的应用程序执行某项密集任务 - 即使事件未被重新启动,Outlook在此期间仍然没有响应。
如果我在消息到达时删除事件处理程序,并在完成bg_DoWork
后再次重新添加它,那么它可以缓解问题 - 但这意味着如果消息在两次之间到达则会丢失消息
为什么会这样?在这种情况下,如何阻止前景变得反应迟钝?
答案 0 :(得分:0)
这是一个命令行应用程序,它不运行COM使用的Windows消息泵。 您是否在GUI应用程序中使用相同的问题?