Outlook Addin:序列化&流问题

时间:2015-02-07 14:58:59

标签: c# serialization vsto outlook-addin

我一直在开发一个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());
        }
    }

1 个答案:

答案 0 :(得分:0)

特里斯坦,

Shutdown Changes for Outlook 2010文章包含以下文字:

确保您快速响应事件并尽快将控制权返回给Outlook。您的加载项应该在Outlook关闭中不会造成用户可察觉的延迟。比较Outlook仅在您的加载项运行时关闭所需的时间,以及在没有任何加载项运行的情况下关闭Outlook以确定任何重大差异所需的时间。

显式地,不要在任何退出事件期间执行网络I / O操作。这包括将数据保存到网络共享,将数据写入Outlook在线模式存储,或在Application.Quit,OnBeginShutdown或OnDisconnection期间调用Web服务。

您似乎需要选择其他位置来序列化树数据。