【问题标题】:First time multithreader第一次使用多线程
【发布时间】:2012-04-12 20:25:42
【问题描述】:

我第一次尝试使用线程,并想出了这个:

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

不过,这对我没有任何作用。我做错了什么?

【问题讨论】:

  • 您错过了对Start 的呼叫。在定义myThread 后尝试添加myThread.Start()
  • 您正试图显示来自工作线程的消息框。 UI 元素只能在主线程上创建。
  • 为了在 .NET 平台上学习线程,我强烈推荐阅读这篇文章:yoda.arachsys.com/csharp/threads/index.shtml
  • @lucas1024 : 但MessageBox.Show() 是线程安全的静态方法。
  • @TheGateKeeper : 如果我想将线程中的一些数据添加到 UI 中,我该怎么办? 这是一个单独的问题,已在此处多次询问和回答已经。

标签: c# winforms multithreading


【解决方案1】:

你没有启动线程。

myThread.Start();

(您在 MessageBox 调用中也有语法错误...)

【讨论】:

    【解决方案2】:

    我第一次尝试使用线程

    尽量避免直接使用 Thread 类。这很少需要。
    调查:

    • 后台工作人员
    • 任务并行库
    • 线程池

    或多或少按这个顺序。

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

    【讨论】:

    • 我认为在初学者的心目中这可能会造成混淆,因为避免“线程类”和避免“多线程”是不同的但听起来相同......只是一个想法 - 另一个想法 - 它可能在没有学习 rdbms/sql 的情况下,像学习 EF 一样跳过 Thread 类是一件坏事……(我不是要批评,只是想……)
    • @Gabriel:是的,一个很好的学习路径是在在控制台应用程序中使用线程。然后在 WinForms 中使用 Bgw。
    【解决方案3】:

    阅读此free chapter from a very good book(诚实的插件 - 这里没有激励):

    它是简洁的,并以渐进的方式为您提供所需的专业知识,因此您不会太快太高。您的问题的答案在前几段中......

    【讨论】:

    • 也许我走错了路……我只想在执行方法时更新进度条。
    • 如果你对线程不感兴趣,那就去stackoverflow.com/questions/1259949/…
    • 这是我需要的。在尝试这个之前,我显然需要了解更多!
    【解决方案4】:

    你需要通过调用Start来启动线程。

    另外,重要的是要注意MessageBox.Show 会发送消息。这就是为什么它可以正常工作1 而无需在该线程上显式调用Application.Run。但是,大多数 UI 表单和控件都不能以这种方式工作。一般来说,不要尝试从工作线程访问或创建任何 UI 元素。


    1从技术上讲,MessageBox 可以从主 UI 线程以外的线程工作,但它可能会导致一些奇怪的问题。例如,此消息框可能会卡在 UI 线程显示的模式对话框后面。正是由于这个原因,不建议显示来自工作线程的 UI 元素,即使它们是通过像 Form.ShowDialogMessageBox.Show 这样的自抽调用来显示的。

    【讨论】:

      猜你喜欢
      • 2013-12-28
      • 2013-04-08
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多