C# Outlook 2013加载项邮件项创建阻止Outlook

C# Outlook 2013加载项邮件项创建阻止Outlook,c#,visual-studio-2013,outlook-addin,outlook-2013,C#,Visual Studio 2013,Outlook Addin,Outlook 2013,我目前正在Visual Studio 2013中使用Office 2013加载项。 我创建了一个带有按钮的功能区,该按钮显示一个小窗口窗体: private void outterMailCreateNewFaxBTN_Click(object sender, RibbonControlEventArgs e) { CreateNewFax cnf = new CreateNewFax(this); cnf.Show(); } 当

我目前正在Visual Studio 2013中使用Office 2013加载项。 我创建了一个带有按钮的功能区,该按钮显示一个小窗口窗体:

        private void outterMailCreateNewFaxBTN_Click(object sender, RibbonControlEventArgs e)
    {
        CreateNewFax cnf = new CreateNewFax(this);
        cnf.Show();
    }
当用户单击表单上的一个按钮时,将创建一个新的邮件项目(其中包含一些信息)

以下是setFaxNumber方法:

public void setFaxNumber(String faxNumber, CreateNewFax cnf)
    {
        cnf = null;
        //mother.Dispose();
        this.faxNumber = faxNumber;

        Outlook.Application application = Globals.ThisAddIn.Application;
        Outlook.MailItem myMailItem = (Outlook.MailItem)application.CreateItem(Outlook.OlItemType.olMailItem);

        myMailItem.To = this.faxNumber;
        myMailItem.Subject = "[FAX:" + this.faxNumber + "]";
        myMailItem.BodyFormat = Outlook.OlBodyFormat.olFormatPlain;
        ((Outlook.ItemEvents_10_Event)myMailItem).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(ThisAddIn_Send);
        this.gMailItem = myMailItem;
        myMailItem.Display(true);

    }
我目前面临的问题是,在用户单击表单上的特定按钮后,Outlook主进程被阻止,UI冻结,直到新创建的消息被发送或丢弃

如何避免这种行为(以便用户能够显示outlook中的其他邮件,而用户仍然可以编辑此新创建的邮件项目)

编辑:Outlook UI在创建邮件项后冻结。此时,Windows窗体仍处于打开状态,我可以像往常一样使用Outlook UI。

编辑:

尝试更改myMailItem.Display(true)带有
myMailItem.Display(假)如文档中所述,false是默认模态参数。如果设置为true,outlook将冻结,直到准备就绪


旧答案(在大多数UI冻结情况下,这将解决问题,但此情况不同):

继续你所说的,听起来像是发送邮件方法在主线程被发送之前一直在等待它,这将导致主UI冻结。处理冻结UI的最佳方法是使用该方法,或者有时您可以使用一个方法并将该方法放在勾号内

我不确定这是否会在我从内存中写入时起作用,但如果要线程化函数,可以这样做:

    var thread = new Thread( () =>
    {
        this.outterMailRibbon.setFaxNumber(faxNumber, this);
    });

    thread.Start();
    thread.Join(); // The thread will auto leave and close once the execution is complete
上面的代码将在一个新线程中执行setFaxNumber方法,该线程与UI运行的主线程分离,这意味着它不会阻止任何UI加载


如果您需要更多信息,请询问,我可以将其添加到我的答案中:)

这不是因为您正在创建一个
Send
方法吗?所以,当你创建一个邮件时,你也创建了一个方法,所以它会等待你处理它?我不确定是不是这样,但这是一个想法。整个outlook窗口都冻结了吗?在任务完成之前,它是否一直处于冻结状态?@Alexarvey:是的,在发送我创建的邮件项目之前,整个Outlook都处于冻结状态。@Zaphod:我刚刚分离了发送事件-同样的行为。Outlook会一直冻结,直到我发送邮件项目为止。以这种方式调用setFaxNumber方法仍然会阻止Outlook UI:(我不知道确切情况。我会说按钮1\u单击方法中的某个位置。您能告诉我,我如何跟踪到特定行吗?尝试注释this.Dispose();行,并查看UI是否仍然挂起以及挂起的时间是否与未注释该行的时间一样长(并且仍然使用线程调用)-但是Outlook UI仍然冻结,直到我发送(或丢弃)邮件项目。尝试将myMailItem.Display(true);替换为myMailItem.Display(false);
    var thread = new Thread( () =>
    {
        this.outterMailRibbon.setFaxNumber(faxNumber, this);
    });

    thread.Start();
    thread.Join(); // The thread will auto leave and close once the execution is complete