奇怪的指数超出范围' (多线程问题)

时间:2014-04-27 12:37:31

标签: c# multithreading indexing visual-studio-2013 threadstatic

我在C#中编写Windows服务(Visual Studio 2013)。 该服务为其连接的每个服务器激活一个线程。

'服务器'对象被定义为' ThreadStatic' (因此每个线程都应该将其作为不同的对象访问):

[ThreadStatic]
public static Server CurServer

在调试时 - 我有时会收到错误:

ArgumentOutOfRangeException
Index was out of range. Must be non-negative and less than the size of the collection.

它出现在以下行中(在'服务器'线程的方法内):

EventConn.FindString = G.CurServer.FilesList[G.CurServer.nFilesIndex].SearchString;

但奇怪的是调试器显示值正常:

G.CurServer.FilesList.count = 1
G.CurServer.nFilesIndex = 0

所以应该出现任何错误!

当我按下F11(调试器步骤)时,它继续进行调试,好像一切都很好,分配也有效......

为什么????? :0

Visual Studio中的错误是在分配当前线程的值之前提示错误吗?或者我没有使用线程安全(更有可能)?

1 个答案:

答案 0 :(得分:0)

我无法解释VS的错误显示,但我找到了错误的原因:

我在线程方法中使用了对象赋值,如下所示:

G.CurServer = server;

而不是像这样克隆对象(How to Clone Objects):

G.CurServer = (Server).Clone();

这第一个赋值导致G.CurServer的值在不同的线程中发生变化,即使它是[ThreadStatic]。

我希望它有助于某人...... 祝福,Eyal。 http://reginiano.com