我debug去单步跟踪的时候,光标跳来跳去的,我怎么追踪,请教下有没好办法
7 个解决方案
#1
先在单线程环境下调好,再写到BackgroundWorker呗。
#2
#3
BackgroundWorker.RunWorkerAsync();
后加上句
Thread.Sleep(-1);
先把主线程塞住,在 DoWork 事件的方法开始处断点,DoWork 调试正常后再把 Sleep 去掉让它们并行。
后加上句
Thread.Sleep(-1);
先把主线程塞住,在 DoWork 事件的方法开始处断点,DoWork 调试正常后再把 Sleep 去掉让它们并行。
#4
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int iRet = -1;
while (!backgroundWorker1.CancellationPending)
{
short[] PriShortChamberRecipeArray = GetRecipeDataFromXml(@"C:\HuaYing\test.xml");
iRet = axActQJ71E71TCP1.WriteDeviceBlock2("R0", PriShortChamberRecipeArray.Length, ref PriShortChamberRecipeArray[0]);
}
}
private short[] GetRecipeDataFromXml(string filename)
{
DataTable table = new DataTable();
table.ReadXml(filename);
//this._lpsData = new short[(table.Rows.Count + 1) * 25];
short[] PriChamberRecipeArray = new short[(table.Rows.Count + 1) * 25];
for (int i = 0; i < table.Rows.Count; i++)
{
object[] objArr = table.Rows[i].ItemArray;
for (int j = 0; j < objArr.Length; j++)
{
if (objArr[j] == System.DBNull.Value)
{
if (j >= 1 && j <= 12)
objArr[j] = 1;
else
continue;
}
//this._lpsData[i * 25 + j] = short.Parse(objArr[j].ToString());
PriChamberRecipeArray[i * 25 + j] = short.Parse(objArr[j].ToString());
}
}
return PriChamberRecipeArray;
}
private void button3_Click(object sender, EventArgs e)
{
int iRet = -1;
while (true)
{
System.Threading.Thread.Sleep(100);
short[] PriShortChamberRecipeArray = GetRecipeDataFromXml(@"C:\HuaYing\test.xml");
iRet = axActQJ71E71TCP1.WriteDeviceBlock2("R0", PriShortChamberRecipeArray.Length, ref PriShortChamberRecipeArray[0]);
}
}
这两段代码都是用的硬件开发包自带的一个函数WriteDeviceBlock2向硬件发送数据。在异步程序里面发送数据就有问题,实际发送的数据并不是PriShortChamberRecipeArray,是比较随机的数据,太奇怪了,都只调用一个方法而已,不解原因
#5
实际上软件开发不是调试出来的,而是自动测试出来的。不过也许你很少见到有用测试驱动方法开发的人,所以不会发现。在测试驱动开发方法下,很少需要调试,因为很多调试都不靠谱(就好象你遇到这种情况)。
在测试程序中执行测试用例,根本没有什么“跳来跳去”的控制逻辑。
在测试程序中执行测试用例,根本没有什么“跳来跳去”的控制逻辑。
#6
你的业务处理的几个程序,应该提取到一个BLL层工程项目中,使用console程序来测试它。
#7
我直接看我硬件里面接收到的数据,不是我发送的,不解原因。
是不是多线程的问题?
#1
先在单线程环境下调好,再写到BackgroundWorker呗。
#2
#3
BackgroundWorker.RunWorkerAsync();
后加上句
Thread.Sleep(-1);
先把主线程塞住,在 DoWork 事件的方法开始处断点,DoWork 调试正常后再把 Sleep 去掉让它们并行。
后加上句
Thread.Sleep(-1);
先把主线程塞住,在 DoWork 事件的方法开始处断点,DoWork 调试正常后再把 Sleep 去掉让它们并行。
#4
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int iRet = -1;
while (!backgroundWorker1.CancellationPending)
{
short[] PriShortChamberRecipeArray = GetRecipeDataFromXml(@"C:\HuaYing\test.xml");
iRet = axActQJ71E71TCP1.WriteDeviceBlock2("R0", PriShortChamberRecipeArray.Length, ref PriShortChamberRecipeArray[0]);
}
}
private short[] GetRecipeDataFromXml(string filename)
{
DataTable table = new DataTable();
table.ReadXml(filename);
//this._lpsData = new short[(table.Rows.Count + 1) * 25];
short[] PriChamberRecipeArray = new short[(table.Rows.Count + 1) * 25];
for (int i = 0; i < table.Rows.Count; i++)
{
object[] objArr = table.Rows[i].ItemArray;
for (int j = 0; j < objArr.Length; j++)
{
if (objArr[j] == System.DBNull.Value)
{
if (j >= 1 && j <= 12)
objArr[j] = 1;
else
continue;
}
//this._lpsData[i * 25 + j] = short.Parse(objArr[j].ToString());
PriChamberRecipeArray[i * 25 + j] = short.Parse(objArr[j].ToString());
}
}
return PriChamberRecipeArray;
}
private void button3_Click(object sender, EventArgs e)
{
int iRet = -1;
while (true)
{
System.Threading.Thread.Sleep(100);
short[] PriShortChamberRecipeArray = GetRecipeDataFromXml(@"C:\HuaYing\test.xml");
iRet = axActQJ71E71TCP1.WriteDeviceBlock2("R0", PriShortChamberRecipeArray.Length, ref PriShortChamberRecipeArray[0]);
}
}
这两段代码都是用的硬件开发包自带的一个函数WriteDeviceBlock2向硬件发送数据。在异步程序里面发送数据就有问题,实际发送的数据并不是PriShortChamberRecipeArray,是比较随机的数据,太奇怪了,都只调用一个方法而已,不解原因
#5
实际上软件开发不是调试出来的,而是自动测试出来的。不过也许你很少见到有用测试驱动方法开发的人,所以不会发现。在测试驱动开发方法下,很少需要调试,因为很多调试都不靠谱(就好象你遇到这种情况)。
在测试程序中执行测试用例,根本没有什么“跳来跳去”的控制逻辑。
在测试程序中执行测试用例,根本没有什么“跳来跳去”的控制逻辑。
#6
你的业务处理的几个程序,应该提取到一个BLL层工程项目中,使用console程序来测试它。
#7
我直接看我硬件里面接收到的数据,不是我发送的,不解原因。
是不是多线程的问题?