我目前正在使用Visual 2013的Office 2013外接程序。我创建了一个带按钮的带,该按钮显示一个小Windows窗体:
private void outterMailCreateNewFaxBTN_Click(object sender, RibbonControlEventArgs e)
{
CreateNewFax cnf = new CreateNewFax(this);
cnf.Show();
}当用户单击窗体上的一个按钮时,将创建一个新的MailItem (其中包含一些信息)。
private void button1_Click(object sender, EventArgs e)
{
this.Dispose();
this.outterMailRibbon.setFaxNumber(faxNumber, this);
}以下是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中的其他邮件,而新创建的MailItem仍可由用户编辑)?
编辑:在创建MailItem之后,Outlook冻结。当时,Windows窗体仍然打开,我可以像往常一样使用Outlook.
发布于 2014-07-10 09:12:28
编辑:
尝试用myMailItem.Display(true);更改myMailItem.Display(false);,因为MailItem.Display文档声明false是默认的模态参数。如果设置为真正的outlook,它将一直冻结到准备就绪为止。
旧的答案是(在大多数UI冻结的情况下,这将解决问题,但是这种情况不同):
通过继续您已经说过的话,听起来似乎send方法在发送主线程之前一直在阻塞主线程,这将导致主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上面的代码将在一个与运行UI的主线程分开的新线程中执行setFaxNumber方法,这意味着它不会阻止任何UI加载。
如果您需要更多的信息,只需问一问,我就可以将它添加到我的回答中:)
https://stackoverflow.com/questions/24671172
复制相似问题