我真的陷入了困境,这个地方是我唯一能得到答案的地方。我请求你从头到尾读完。
我有一个方法在下面做这样的事情:
public void Execute(Data data)
{
bool IsOk = false;
//1st point
IsOk = Check1();
//2nd point
if(IsOk)
IsOk = Check2();
//3nd point
if(IsOk)
IsOk = Check3();
//4th point
if(IsOk)
SendMessage();
}
数据对象是通过一种STATIC
方法获取的,以防止超过 1 个线程访问它,如下所示:
[MethodImpl(MethodImplOptions.Synchronized)]
public static DataCollection GetDataColl()
{
//By syncronizing, I'm guaranteeing every data is unique.
DataCollection Result = new DataCollection();
Result = GetDataFromDatabase();//Changing status in order to prevent getting it again
return Result;
}
在此之后,我将以下方法提供THREADS
给处理DataCollection
:
//When invoked, creates the threads that runs my actual processing method
private void btnStart_Click(object sender, EventArgs e)
{
for(int i= 1; i <= 2; i++ )
{
Thread ProcessThread = new Thread(ProcessData);
ProcessThread.Start();
}
}
//Process the data
private void ProcessData()
{
DataCollection Coll = GetDataColl(); //GetDataColl is static, threadsafe that can be invoked only by 1 thread at a time method.
//Foreach through data and execute the PROBLEMATIC method "Execute" at the beginning
foreach(Data dta in Coll)
Execute(dta); //The problem occurs in this method
}
问题不时发生,但并非总是如此,但你可以一次给它大约 20%,我想这已经足够了。这是发生的事情:
Thread 1
: 运行 Execute 方法的第一个点Thread 1
: 运行 Execute 方法的第 2 点Thread 1
: 运行 Execute 方法的第三点Thread 2
:运行 Execute 方法的第 4 点 -> Wierd!Thread 1
: 运行 Execute 方法的第 4 点
出乎意料的是,在方法的中间,这个新线程就在这个点上,并执行了整个方法的一部分。这个新线程(Thread 2
)甚至根本没有到达第 1、第 2 和第 3 点)
有时它也会按以下顺序发生:
Thread 1
: 运行 Execute 方法的第一个点Thread 1
: 运行 Execute 方法的第 2 点Thread 2
:运行 Execute 方法的第 4 点 -> Weird!Thread 1
:运行 Execute 方法的第三点。Thread 1
:运行 Execute 方法的第 4 点。
所有这些都是从日志文件中读取和写入的,而不是通过调试。当我进行调试时,一切似乎都很好。
我使用了 log4net,这里是发生的事情的简化示例:
2013-02-19 09:53:02,057 [39] DataId: 4356502 - Check1
2013-02-19 09:53:02,088 [39] DataId: 4356502 - Check2
2013-02-19 09:53:02,088 [39] DataId: 4356502 - Check3
2013-02-19 09:53:02,542 [39] DataId: 4356502 - Send
2013-02-19 09:53:02,573 [46] DataId: 4356502 - Send
线程 46 甚至根本没有检查 1、2、3。