线程安全ReferenceEquals

克里斯

我尝试创建一个VSTO加载项。在其中,我将工作表对象存储在列表中。对于我的Addin,使用延迟的函数调用在自己的线程中执行它很重要。因此,当我打电话时,TestClass.run()我会遍历工作表列表两次,第一次是在调用延迟函数之前,其次是在延迟函数中。第二个调用不能匹配工作表实例。我怎样才能做到这一点?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;
using System.Timers;

namespace Ventron.VRange
{
    public class TestClass
    {
        private static List<OuterWorksheet> sheetList = new List<OuterWorksheet>();

        public static void run(Range range)
        {
            TestClass.sheetList.Add(new OuterWorksheet(range.Worksheet));
            TestClass.getWorkSheet(range.Worksheet);

            ElapsedEventHandler delayedFn = delegate(object sender, ElapsedEventArgs e)
            {
                System.Timers.Timer theTimer = (System.Timers.Timer)sender;
                if (theTimer.Enabled)
                {
                    theTimer.Stop();
                    theTimer.Enabled = false;
                    theTimer.Dispose();
                    theTimer = null;
                    TestClass.getWorkSheet(range.Worksheet);
                }
            };

            System.Timers.Timer timerInstance = new System.Timers.Timer(1);
            timerInstance.Elapsed += new System.Timers.ElapsedEventHandler(delayedFn);
            timerInstance.Interval = 1;
            timerInstance.Enabled = true;
        }

        internal static OuterWorksheet getWorkSheet(Worksheet worksheet)
        {
            System.Diagnostics.Debug.Write("*****************************\n");
            System.Diagnostics.Debug.Write(worksheet.CodeName + "\n");

            foreach (OuterWorksheet outerWS in TestClass.sheetList)
            {
                System.Diagnostics.Debug.Write(outerWS.worksheet.CodeName + "\n");
                if (outerWS.worksheet.Equals(worksheet))
                {
                    System.Diagnostics.Debug.Write("Worksheets are equal\n");
                    return outerWS;
                } else
                    System.Diagnostics.Debug.Write("Worksheets are not equal\n");
            }
            return null;
        }

        internal class OuterWorksheet
        {
            public Worksheet worksheet { get; private set; }
            public OuterWorksheet(Worksheet worksheet)
            {
                this.worksheet = worksheet;
            }
        }
    }
}

输出为:

*****************************
Sheet5
Sheet5
Worksheets are equal

*****************************
Sheet5
Sheet5
Worksheets are not equal

谢谢!

史蒂夫·米切姆(Steve Mitcham)

每次获取工作表时,它都会围绕由Excel公开的COM对象生成一个新的包装实例,因此,按引用它们永远不会相等。Excel需要唯一的工作表名称,因此在检查是否相等时只需比较名称即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章