线程安全的ReferenceEquals

我尝试创build一个VSTO插件。 在这里我将工作​​表对象存储在列表中。 对于我的Addin,使用延迟函数调用在自己的Thread中执行它是很重要的。 所以当我调用TestClass.run()我通过我的工作表列表2次,首先调用延迟function之前,第二次在延迟function。 第二个调用不能匹配工作表实例。 我怎样才能做到这一点?

 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 

谢谢!

每当你得到一个工作表时,它都会生成一个新的包装器实例,这个实例是由excel公开的COM对象的,所以它们永远不会被引用相等。 Excel需要唯一的表单名称,因此只需比较检查相等时的名称。