我一直在开发一个outlook-addin,用于跟踪树视图控件中的特定电子邮件。打开和关闭outlook时,treenodes被序列化/反序列化并通过流保存到文件中。我遇到的问题是,在添加新TreeNode后关闭应用程序时,它并不总是序列化并保存。这似乎只有在我快速打开应用程序,添加一些节点并关闭时才会发生。当我在短时间内不打开和关闭时,它可以正常工作。
我的代码如下,我认为非常简单。我相对缺乏经验,我认为必须有一些基本规则,我不会在这里遵循。我的猜测是我没有正确使用流类?
((Outlook.ApplicationEvents_11_Event)Application).Quit += new Outlook.ApplicationEvents_11_QuitEventHandler(ThisAddIn_Quit);
private void PopulateTree()
{
try
{
using (Stream fileO = File.Open(@"Data.dat", FileMode.OpenOrCreate))
{
if (fileO.Length != 0)
{
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(fileO);
TreeNode[] nodeList = (obj as IEnumerable<TreeNode>).ToArray();
Globals.ThisAddIn.myUserControl1.ResponseTree.Nodes.AddRange(nodeList);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
void ThisAddIn_Quit()
{
try
{
using (Stream file = File.Open(@"Data.dat", FileMode.Create))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(file, Globals.ThisAddIn.myUserControl1.ResponseTree.Nodes.Cast<TreeNode>().ToList());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
答案 0 :(得分:0)
特里斯坦,
Shutdown Changes for Outlook 2010文章包含以下文字:
确保您快速响应事件并尽快将控制权返回给Outlook。您的加载项应该在Outlook关闭中不会造成用户可察觉的延迟。比较Outlook仅在您的加载项运行时关闭所需的时间,以及在没有任何加载项运行的情况下关闭Outlook以确定任何重大差异所需的时间。
显式地,不要在任何退出事件期间执行网络I / O操作。这包括将数据保存到网络共享,将数据写入Outlook在线模式存储,或在Application.Quit,OnBeginShutdown或OnDisconnection期间调用Web服务。
您似乎需要选择其他位置来序列化树数据。