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();
}));
}
...全文
500 5 打赏 收藏 转发到动态 举报
写回复
用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值
本节提供有关关键的 C# 语言功能和 C# 可通过 .NET Framework 访问的功能的详细信息。 本节中大部分内容都假定您已了解有关 C# 和一般编程概念的一些知识。如果您刚开始学习编程或 C#,则应从 Visual C# 指导教程开始。您可能还想访问 Visual C# 开发中心,此处提供很多教程、示例和视频,可帮助您入门。 有关特定的关键字、运算符和预处理器指令的信息,请参见 C# 参考。有关 C# 语言规范的信息,请参见 C# 语言规范。 这部分提供有关 C# 关键字、运算符、编译器错误和警告的参考资料。 ---------------------------------------------------------------------------------- 语言部分 深入 C# 程序 Main() 和命令行参数C# 编程指南) 类型(C# 编程指南) 数组(C# 编程指南) 字符串(C# 编程指南) 语句、表达式和运算符(C# 编程指南) 类和结构(C# 编程指南) 属性(C# 编程指南) 索引器(C# 编程指南) 委托(C# 编程指南) 事件(C# 编程指南) 泛型(C# 编程指南) LINQ 查询表达式(C# 编程指南) Lambda 表达式(C# 编程指南) 迭代器(C# 编程指南) 命名空间(C# 编程指南) 可空类型(C# 编程指南) 不安全代码和指针(C# 编程指南) XML 文档注释(C# 编程指南) 平台部分 应用程序域(C# 编程指南) 程序集和全局程序集缓存(C# 编程指南) 属性(C# 编程指南) 集合类(C# 编程指南) 异常和异常处理(C# 编程指南) 互操作性(C# 编程指南) 线程处理(C# 编程指南) 性能(C# 编程指南) 反射(C# 编程指南) C# DLL(C# 编程指南) 安全性(C# 编程指南) 请参见 其他资源 C# 参考 Visual C# Visual C# 指导教程 ---------------------------------------------------------------------------------- 本节内容 C# 关键字 提供指向有关 C# 关键字和语法的信息的链接。 C# 运算符 提供指向有关 C# 运算符和语法的信息的链接。 C# 预处理器指令 提供指向有关在 C# 源代码进行嵌入所使用的编译器命令的信息的链接。 C# 编译器选项 包括有关编译器选项以及如何使用这些选项的信息。 C# 编译器错误 包含一些代码段,演示 C# 编译器错误和警告的原因以更正方法。 C# 术语 提供 C# 单词和短语的词汇表。 相关章节 C# 语言规范 提供一些链接,供获取 Microsoft Word 格式的最新版本的 C# 语言规范。 C# 常见问题C# Developer Center 中提供内容不断增加的 C# 常见问题列表。 Microsoft 知识库中的 C# 知识库文章 提供对存储在 MSDN 上的 C# 相关知识库文章的动态搜索。 Visual C# 提供 Visual C# 文档门户。 Visual C# 示例 提供 Visual C# 示例的列表和有关如何在本地磁盘上查找这些示例的说明。 Visual C# 代码编辑器功能 提供一些链接,这些链接指向描述 IDE 和编辑器的概念性主题及任务主题。 用 Visual C# 编写应用程序 提供一些链接,这些链接指向说明如何执行某些常见编程任务的主题。 C# 编程指南 包括关于如何使用 C# 编程语言的信息。

110,534

社区成员

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

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

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