2012-04-12 31 views
0

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

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

这不会对我做任何事,但。我做错了什么?

+4

你错过了对“开始”的调用。在定义'myThread'之后尝试添加'myThread.Start()'。 – 2012-04-12 20:28:01

+4

您正试图从工作线程显示消息框。 UI元素只能在主线程上创建。 – 2012-04-12 20:28:15

+0

为了学习.NET平台中的线程,我强烈建议阅读以下内容:http://www.yoda.arachsys.com/csharp/threads/index.shtml – 2012-04-12 20:29:31

回答

3

阅读本free chapter from a very good book(诚实插件 - 没有inscentive这里):

这是consice并为您提供的诀窍,你要以增量的方式,这样你就不会走太高的水平过快。你的问题的答案是在前几段...

+0

也许我以这种错误的方式去做......我只想在执行方法时更新进度条。 – TheGateKeeper 2012-04-12 20:45:19

+0

如果你不给线索的唠叨,那么去http://stackoverflow.com/questions/1259949/how-do-i-implement-a-progress-bar-in-c – 2012-04-12 20:46:54

+0

这就是我需要的。尝试此操作之前,我显然需要了解更多信息! – TheGateKeeper 2012-04-12 20:58:23

6

您没有启动线程。

myThread.Start(); 

(您也可以在MessageBox的调用语法错误...)

4

我想使用线程首次

尽量避免使用线程直接上课。这很少需要。
查找到:

  • BackgroundWorker的
  • 任务并行库
  • 线程池

的顺序更多或更少。

它们都提供线程顶层来帮助你。

+0

我认为在初学者的脑海中可能会混淆,因为避免“Thread类”和避免“Multi threading”是截然不同的,但听起来是一样的......只是一个想法 - 另一个想法 - 它可能是一个坏在没有学习rdbms/sql的情况下,沿着与学习EF相同的路线跳过Thread类(我不想批评,只是在想..) – 2012-04-12 20:38:31

+0

@Gabriel - 我在编辑时添加了_directly_。 – 2012-04-12 20:39:29

+0

@ Gabriel:是的,一个好的学习途径是使用线程_in控制台App_。然后在WinForms中使用Bgw。 – 2012-04-12 20:45:00

1

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

此外,重要的是要注意,MessageBox.Show泵的消息。这就是为什么它正常工作没有在该线程上显式调用Application.Run。尽管大多数UI表单和控件不以这种方式工作。一般情况下,不要尝试从工作线程访问或创建任何UI元素。


一个MessageBox可以从技术上比主UI线程的线程上运行,但它可能会导致一些奇怪的问题。例如,此消息框可能卡在UI线程显示的模式对话框后面。正因为如此,建议不要在工作线程中显示UI元素,即使这些元素是通过自我抽取调用如Form.ShowDialogMessageBox.Show来完成的。