2012-04-12 29 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來完成的。