1

C# (Visual Studio 2013) で Windows サービスを作成しています。サービスは、接続先のサーバーごとにスレッドをアクティブ化します。

「サーバー」オブジェクトは「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 のバグですか? それとも、私はスレッドセーフリーを使用していないのでしょうか (より可能性が高い)?

4

1 に答える 1

0

VS の表示の悪さについては説明できませんが、エラーの原因がわかりました。

次のように、スレッドのメソッドでオブジェクトの割り当てを使用しました。

G.CurServer = server;

このようにオブジェクトを複製する代わりに ( How to Clone Objects ):

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

この最初の割り当てにより、[ThreadStatic] であっても、異なるスレッドで G.CurServer の値が変更されました。

誰かのお役に立てば幸いです...よろしくお願いします、Eyal。http://reginiano.com

于 2014-04-27T14:17:29.890 に答える