C# 第一次多线程

C# 第一次多线程,c#,winforms,multithreading,C#,Winforms,Multithreading,我第一次尝试使用线程,并得出以下结论: Thread myThread = new Thread(() => { test = Class1.getNumbers(param1, param 2); MessageBox.Show(test.toString()); }); 但这对我没什么用。我做错了什么?你没有启动线程 myThread.Start(); (MessageBox调用中也有语法错误…) 我第一次尝试使用线程 尽量避免直接使用Thread类。这是

我第一次尝试使用线程,并得出以下结论:

Thread myThread  = new Thread(() =>
  {
    test = Class1.getNumbers(param1, param 2);
    MessageBox.Show(test.toString());
  });

但这对我没什么用。我做错了什么?

你没有启动线程

myThread.Start();
(MessageBox调用中也有语法错误…)

我第一次尝试使用线程

尽量避免直接使用Thread类。这是很少需要的。
研究:

  • 幕后工作者
  • 任务并行库
  • 线程池
大致按那个顺序


它们都在线程之上提供层来帮助您

您需要通过调用
start
来启动线程

另外,重要的是要注意
MessageBox.Show
泵送消息。这就是为什么它在没有显式调用
应用程序的情况下正常工作1。在该线程上运行
。不过,大多数UI表单和控件都不是这样工作的。通常,不要试图从工作线程访问或创建任何UI元素


1A
MessageBox
在技术上可以从主UI线程以外的线程工作,但它可能会导致一些奇怪的问题。例如,此消息框可能会卡在UI线程显示的模式对话框后面。正是出于这个原因,除其他原因外,不建议显示工作线程中的UI元素,即使它们是通过像
Form.ShowDialog
MessageBox.Show这样的自泵调用来显示的(诚实的插件-此处无提示):


它是一致的,以渐进的方式为您提供所需的专业知识,这样您就不会走得太高或太快。您的问题的答案在前几段中…

您错过了对
Start
的调用。在定义
myThread
之后,尝试添加
myThread.Start()
。您正在尝试显示来自工作线程的消息框。UI元素只能在主线程上创建。为了在.NET平台上学习线程,我强烈建议阅读以下内容:@lucas1024:但是
MessageBox.Show()
是线程安全的静态方法。@GateKeeper:如果我想将线程中的一些数据添加到UI中,我该怎么办?这是一个单独的问题,在这里已经被问过很多次了。我认为在初学者的头脑中,这可能会混淆,因为避免“线程类”和避免“多线程”是不同的,但听起来是一样的。。。只是一个想法-另一个想法-跳过Thread类与学习EF相同,而不学习rdbms/sql可能是一件坏事。。。(我不是想批评,只是想…)@Gabriel:是的,一个很好的学习方法是在控制台应用程序中使用这个线程。然后在WinForms中使用Bgw。也许我走错了方向。。。我只想在执行一个方法时更新一个进度条。如果你对线程不感兴趣,那就按照我的要求去做吧。我显然需要在尝试之前了解更多!