首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Outlook 2013外接程序MailItem创建阻塞Outlook

Outlook 2013外接程序MailItem创建阻塞Outlook
EN

Stack Overflow用户
提问于 2014-07-10 07:53:09
回答 1查看 1.3K关注 0票数 1

我目前正在使用Visual 2013的Office 2013外接程序。我创建了一个带按钮的带,该按钮显示一个小Windows窗体:

代码语言:javascript
复制
        private void outterMailCreateNewFaxBTN_Click(object sender, RibbonControlEventArgs e)
    {
        CreateNewFax cnf = new CreateNewFax(this);
        cnf.Show();
    }

当用户单击窗体上的一个按钮时,将创建一个新的MailItem (其中包含一些信息)。

代码语言:javascript
复制
private void button1_Click(object sender, EventArgs e)
    {
        this.Dispose();
        this.outterMailRibbon.setFaxNumber(faxNumber, this);
    }

以下是setFaxNumber-方法:

代码语言:javascript
复制
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中的其他邮件,而新创建的MailItem仍可由用户编辑)?

编辑:在创建MailItem之后,Outlook冻结。当时,Windows窗体仍然打开,我可以像往常一样使用Outlook.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-10 09:12:28

编辑:

尝试用myMailItem.Display(true);更改myMailItem.Display(false);,因为MailItem.Display文档声明false是默认的模态参数。如果设置为真正的outlook,它将一直冻结到准备就绪为止。

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

通过继续您已经说过的话,听起来似乎send方法在发送主线程之前一直在阻塞主线程,这将导致主UI冻结。处理冻结UI的最佳方法是对方法进行线程,或者有时您可以使用调度员定时器并将该方法放入滴答中。

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

代码语言:javascript
复制
    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

上面的代码将在一个与运行UI的主线程分开的新线程中执行setFaxNumber方法,这意味着它不会阻止任何UI加载。

如果您需要更多的信息,只需问一问,我就可以将它添加到我的回答中:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24671172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档