【问题标题】:Outlook Addin: Serialization & Stream IssueOutlook 插件:序列化和流问题
【发布时间】:2015-02-09 19:05:38
【问题描述】:

我一直在开发一个可以在树视图控件中跟踪特定电子邮件的 Outlook 插件。打开和关闭 Outlook 时,树节点会被序列化/反序列化并通过流保存到文件中。我遇到的问题是当我在添加新的 TreeNodes 后关闭应用程序时,它并不总是序列化和保存。这似乎只有在我快速打开应用程序、添加一些节点并关闭时才会发生。当我在短时间内不打开和关闭时,它工作得很好。

我的代码如下,我认为非常简单。我相对缺乏经验,我想一定有一些我在这里没有遵循的基本规则。我的猜测是我没有正确使用流类??

((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());
        }
    }

【问题讨论】:

  • 每次都会调用 Quit 事件吗?您是否尝试调试代码?请参阅Shutdown Changes for Outlook 2010 了解更多信息。
  • 感谢您的链接,它确认我订阅了正确的活动。这很奇怪,我只有在反复调试代码时才会遇到问题。我很肯定每次我退出时都会调用该事件。我唯一能做的就是树视图对象在它可以序列化之前从内存中消失,所以什么都没有保存?我想解决方案可能是在每次更改树视图时序列化并保存。
  • 是的。尝试实现该场景。

标签: c# serialization vsto outlook-addin


【解决方案1】:

特里斯坦,

Shutdown Changes for Outlook 2010 文章有以下文字:

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

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

看来你需要选择另一个地方来序列化树数据。

【讨论】:

  • 这篇文章并没有说你不能使用退出事件来避免它,因为它可以延迟关闭,特别是在你执行网络 I/O 操作时。无论哪种方式,我都尝试转储代码以将文件保存到按钮单击方法中,它会保存几次,但经过几次重复保存后,它会停止保存。我如何实现流一定有问题??
猜你喜欢
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2018-08-11
  • 2011-04-05
  • 2016-04-27
  • 2015-03-20
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多