请看这个示例代码:
private void StartProgram()
{
for (int i = 0; i < 10; i++)
{
if (true) // some conditions
{
int Temp = i; // every thread has different memory location for Temp variable.
Thread ConnectThread = new Thread(ThreadMethod);
ConnectThread.Start(Temp);
}
}
}
private static void ThreadMethod(object Index)
{
int ID = (int)Index;
int Result = 0;
bool IsConnected;
Result = ClientSMPP[ID].tcpConnect(Host[ID], int.Parse(Port[ID]));
InsertToDatabaseMethod();
}
据我所知,Temp变量在每个线程的内存中有不同的位置。我的意思是每个线程都有一个单独的字段。但是当我想在ThreadMethod中做一些动作时,ID字段会发生冲突。我的意思是,每次ThreadMethod运行时它都没有唯一的价值(例如ID的值是&#39; 1&#3; 3倍)。我知道ThreadMethod中可能有多个线程,但它们有不同的内存。我不想使用Lock()。
我如何忽略这种冲突?
答案 0 :(得分:2)
根据您的要求,将此回复移至“回答”。很高兴我能帮助你! :)
您在不传递值的情况下调用InsertToDatabaseMethod()。
如果插入的值来自外部源(例如:属性),那么是的,锁是可行的方法。
如果值是本地的(例如:您在数据库中插入“ID”,那么您可以将值作为参数传递以避免锁定:InsertToDatabaseMethod(ID)
答案 1 :(得分:0)
您可以像这样简化:
for (int i = 0; i < 10; i++)
{
if (true) // some conditions
{
Thread ConnectThread = new Thread(ThreadMethod);
ConnectThread.Start(i);
}
}
请注意,每个线程都有自己的堆栈。 局部变量存储在堆栈中。
您没有问题,因为整数是值类型。