首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程安全ReferenceEquals

线程安全ReferenceEquals
EN

Stack Overflow用户
提问于 2015-02-19 13:33:48
回答 1查看 123关注 0票数 0

我试图创建一个VSTO Addin。在此范围内,我将工作表对象存储在列表中。对于我的Addin,使用延迟函数调用在自己的线程中执行它是很重要的。因此,当我调用TestClass.run()时,我遍历我的工作表列表2次,首先在调用延迟函数之前,第二次在延迟函数中。第二个调用与工作表实例不匹配。我怎样才能做到这一点?

代码语言:javascript
复制
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;
            }
        }
    }
}

产出如下:

代码语言:javascript
复制
*****************************
Sheet5
Sheet5
Worksheets are equal

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-19 13:43:25

每次您获得工作表时,它都会围绕excel公开的COM对象生成一个新的包装器实例,因此它们从不等于引用。Excel需要唯一的工作表名,所以在检查是否相等时,只需比较这些名称即可。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28607754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档