我在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中的错误是在分配当前线程的值之前提示错误吗?或者我没有使用线程安全(更有可能)?
答案 0 :(得分:0)
我无法解释VS的错误显示,但我找到了错误的原因:
我在线程方法中使用了对象赋值,如下所示:
G.CurServer = server;
而不是像这样克隆对象(How to Clone Objects):
G.CurServer = (Server).Clone();
这第一个赋值导致G.CurServer的值在不同的线程中发生变化,即使它是[ThreadStatic]。
我希望它有助于某人...... 祝福,Eyal。 http://reginiano.com