c# 循环开启多线程 lambda表达式带参数问题

snser 2014-05-29 02:56:43
for循环开启多线程,用lambda表达式传递参数,线程里拿到的参数和传递的参数不一样,另外线程名也没有获取到。
具体的在代码里注释了,劳请各位看一下,谢啦!

private void btnSend_Click(object sender, EventArgs e)
{
sendMsgManager(5);
}

private void sendMsgManager(int totalThreadCount)
{
for (int thread = 0; thread != totalThreadCount; thread++)
{
{
//这里传递的参数为0 1 2 3 4
Thread sendMsgThead = new Thread(() => sendMsgThreadAction(thread));
//这里定义了线程名
sendMsgThead.Name = "sendMsgThead" + thread.ToString();
this.Invoke((EventHandler)(delegate
{
rtxtOutput.AppendText(thread.ToString() + "&&&\n");
}));

sendMsgThead.Start();
}
else
{
break;
}
}
}

private void sendMsgThreadAction(int startIndex)
{

this.Invoke((EventHandler)(delegate
{
rtxtOutput.SelectionColor = Color.Blue;
//这里打印出的参数为1 2 3 4 5
//这里打印出的线程名为空
rtxtOutput.AppendText(Thread.CurrentThread.Name + " " + startIndex +"\n");
rtxtOutput.Focus();
}));
}
...全文
536 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyuehen 2014-05-29
  • 打赏
  • 举报
回复
{ var idx = thread; //这里传递的参数为0 1 2 3 4 Thread sendMsgThead = new Thread(() => sendMsgThreadAction(idx)); //这里定义了线程名 sendMsgThead.Name = "sendMsgThead" + idx.ToString(); this.Invoke((EventHandler)(delegate { rtxtOutput.AppendText(idx.ToString() + "&&&\n"); })); sendMsgThead.Start(); } else { break; }
xiaoyuehen 2014-05-29
  • 打赏
  • 举报
回复

{
                    var idx = thread;
                    //这里传递的参数为0 1 2 3 4
                    Thread sendMsgThead = new Thread(() => sendMsgThreadAction(idx));
                    //这里定义了线程名
                    sendMsgThead.Name = "sendMsgThead" + idx.ToString();
                    this.Invoke((EventHandler)(delegate
                    {
                        rtxtOutput.AppendText(idx.ToString() + "&&&\n");
                    }));
 
                    sendMsgThead.Start();
}
else
{
        break;
}
sunny906 2014-05-29
  • 打赏
  • 举报
回复

        private void sendMsgManager(int totalThreadCount)
        {
            for (int thread = 0; thread != totalThreadCount; thread++)
            {

                //这里传递的参数为0 1 2 3 4
                Thread sendMsgThead = new Thread(() => sendMsgThreadAction(thread));
                //这里定义了线程名
                sendMsgThead.Name = "sendMsgThead" + thread.ToString();
                sendMsgThead.Start();
                rtxtOutput.Invoke((EventHandler)(delegate
                {
                    rtxtOutput.AppendText(thread.ToString() + "&&&\n");
                }));
            }
        }

        private void sendMsgThreadAction(int startIndex)
        {
            rtxtOutput.Invoke((EventHandler)(delegate
            {
                rtxtOutput.SelectionColor = Color.Blue;
                //这里打印出的参数为0 1 2 3 4
                //这里打印出的线程名为空
                rtxtOutput.AppendText(Thread.CurrentThread.Name + " " + startIndex + "\n");
                rtxtOutput.Focus();
            }));
        }

snser 2014-05-29
  • 打赏
  • 举报
回复
引用 1 楼 wmg494005678 的回复:
this.Invoke 把操作交给UI线程去处理了,你可以观察一下Thread.CurrentThread.ManagedThreadId值
原来如此!太谢谢了! 那开启线程传递参数的时候值变化了是什么原因啊?
wmg494005678 2014-05-29
  • 打赏
  • 举报
回复
this.Invoke 把操作交给UI线程去处理了,你可以观察一下Thread.CurrentThread.ManagedThreadId值

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧