2013-12-20 116 views
-3

嗨我有一個應用程序,我做了,我試圖通過運行多線程到目前爲止,我已經做到了這一點。多線程問題

Public Class mainfrm 
    Dim x As System.Threading.ThreadStart 
    Public Function RunThreads(count As Integer, start As ThreadStart) As List(Of Thread) 
     Dim list As New List(Of Thread) 
     For i = 0 To count - 1 
      Dim thread = New Thread(start) 
      thread.Start() 
      list.Add(thread) 
     Next 
     Return list 
    End Function 


Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click 
    RunThreads(10, x) 

但是當我點擊它給了我一個錯誤

enter image description here

+0

x的值是什麼?錯誤消息推斷x是空的 – har07

+2

我建議你閱讀關於多線程的MSDN文章,因爲你的代碼毫無意義... http://msdn.microsoft.com/en-us/library/eed6swsx(v = vs.90).aspx –

+1

什麼是* start *這裏? –

回答

0

看你的代碼鍵,X不是實例。

正確的指令來創建你的X是:

Private x As System.Threading.ThreadStart = New System.Threading.ThreadStart(SubToRun) 

調用已在你的線程運行子,你可以使用此代碼。

Private x As New System.Threading.ThreadStart(SubToRun) 'Shortened version of above statement 
Public Function RunThreads(count As Integer, start As ThreadStart) As List(Of Thread) 
    Dim list As New List(Of Thread)() 
    For i As Integer = 0 To count - 1 
     Dim thread As dynamic = New Thread(start) 
     thread.Start() 
     list.Add(thread) 
    Next 
    Return list 
End Function 


Private Sub Button1_Click_1(sender As Object, e As EventArgs) 
    RunThreads(10, x) 
End Sub 

Private Shared Sub SubToRun() 
    'DoTasks; 
End Sub 
+0

這樣做後,我現在得到這個 Dim x As System.Threading.ThreadStart = New System.Threading.ThreadStart(AddressOf Button1_Click_1() http://i.imgur.com/qFlkvhF.png –

+0

首先,你不應該將X設置爲運行Button1_Click_1方法,因爲它肯定會以無限循環結束。查看屏幕截圖中的錯誤,看起來它需要一個無參數方法,所以請先嚐試一下。 – FoxHound

+0

你知道我不是這個即時通訊的專業人士,所以你可以解釋一下嗎? 謝謝! –

0

你會更好地處理任務和任務工廠。

http://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

Imports System.Threading.Tasks 

Dim task1 As Integer() = Task(Of Integer()).Factory.StartNew(
    Function() 
     Dim IntArray(10) As Integer 
     For i As Integer = 1 To 10 
      IntArray(i) = i 
     Next 
     Return IntArray 
    End Function 
).Result 

For Each i As Integer In task1 
    Console.WriteLine(task1(i).ToString) 
Next 

Console.ReadLine() 

確保有一個原因,在不同的線程的處理事情,雖然,上面的例子就是這樣,會有使用線程這樣的事情沒有意義的,但如果你想運行一個任務並且不鎖定用戶界面,那麼這將很好地利用線程。

另外值得注意的是,從任務獲取結果將鎖定調用線程,直到它完成。