【发布时间】:2013-04-17 11:52:37
【问题描述】:
我有一个控制窗体的主线程,在按下按钮时会执行两个线程。一个用于记录信息,另一个用于读取信息。将这些放入线程背后的想法是让用户能够在执行时与界面进行交互。
这里是两个线程的创建;
Thread recordThread = new Thread(() => RecordData(data));
recordThread.Name = "record";
recordThread.Start();
Thread readThread = new Thread(() => ReadData(data));
readThread.Name = "read";
readThread.Start();
data 只是一个数据对象,用于存储在录制过程中记录的数据。
我面临的问题是第一个线程执行得很好,第二个拒绝运行,直到第一个完成。在第二个线程函数中放置一个断点,ReadData 让我知道只有在第一个线程完成所有记录后才会调用它。
我已经尝试解决这个问题几个小时了,但我无法理解它为什么会这样做。添加一个;
while(readThread.IsAlive) { }
在开始之后将停止执行之后的任何内容,并且它的状态是正在运行。但它不会转到给定的方法。
有什么想法吗?
编辑: 线程调用的两个函数是;
private void RecordData(Data d)
{
int i = 0;
while (i < time * freq)
{
double[] data = daq.Read();
d.AddData(data);
i++;
}
}
private void ReadData(Data d)
{
UpdateLabelDelegate updateData =
new UpdateLabelDelegate(UpdateLabel);
int i = 0;
while (i < time * freq)
{
double[] data = d.ReadLastData();
this.Invoke(updateData, new object[] { data });
i++;
}
}
data 对象在调用的两个函数中都有锁定; ReadLastData 和读取。
这里是 Data 对象中的方法。
public void AddData(double[] data)
{
lock (this)
{
int i = 0;
foreach (double d in data)
{
movementData[i].Add(d);
i++;
}
}
}
public double[] ReadLastData()
{
double[] data = new double[channels];
lock (this)
{
int i = 0;
foreach (List<double> list in movementData)
{
data[i] = list[list.Count - 1];
}
}
return data;
}
【问题讨论】:
-
这取决于第二个线程是否正在等待第一个线程锁定的资源(猜测
data)。你有什么锁? -
请展示一个简短但完整的程序来说明问题。
-
请显示更多代码,这还不够
-
@Belogix AFAIK 锁定不会阻止线程本身运行。然而,它会阻塞 inside 该线程,直到另一个线程释放该对象。
-
这就是我的意思@James,我们不知道他在线程内做什么(即一个会锁定另一个)。我并不是说它会阻止它继续前进。
标签: c#