读书人

【线程相关】不知是小弟我程序的有关问

发布时间: 2012-12-26 14:39:28 作者: rapoo

【线程相关】不知是我程序的问题还是微软BUG
本帖最后由 lanzhenkai 于 2012-12-13 17:52:13 编辑 我用的线程调用一个方法这个方法有两个参数

if (buf[0] == 0xF5)
{
if (index >= 7)
{
length = buf[6] + 9;
if (index == length)
{
td = new Thread(delegate() { Panduan(buf, index); });
//注意着个Panduan()的方法 有两个参数 一个是BUF 一个是I
td.IsBackground = true;
td.Start();
index = 0;
length = 0;
}
else if (index > length)
{
index = 0;
length = 0;
}


}
}
else
{
index = 0;
length = 0;
Thread.Sleep(50);
}


我在调用玩panduan的方法后执行了这样一段代码
td = new Thread(delegate() { Panduan(buf, index); });
td.IsBackground = true;
td.Start();
index = 0;
length = 0;
清空操作(标红) 吧index length 都清零了

panduan方法:
 public void Panduan(byte[] content,int index)
{
//这个方法有两个参数 也就是上面线程调用方法的时候传过来的参数
}



现在出现了这样一个问题:如果我在第一段代码的if下打个断点 调试着执行 这个panduan方法的index参数的值就等于第一段代码中传过来的参数值。如果我只在panduan方法下打断点panduan方法的index参数就是0

我一直很郁闷 之后我用这种方法解决的
if (index == length) 
{
int i = index;
td = new Thread(delegate() { Panduan(buf, i); });


td.IsBackground = true;
td.Start();
index = 0;
length = 0;
}




int i = index;
td = new Thread(delegate() { Panduan(buf, i); });


我在想他这个线程是不是在不打断点的时候吧上面的方法执行完了然后才执行线程呢~!!! 要么他怎么会是0!


[解决办法]
玩线程,不关注锁,线程不会阻塞你当前进程,你start线程后,代码 会继续执行,所以你放到得值可能不是你期望的
[解决办法]
那是正常的闭包(closure)行为,相当于index被那个delegate()匿名函数"捕获"了。
你的解决方法也没有问题。
以后你会理解的。

读书人网 >C#

热点推荐