2013-12-20 117 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() 

确保有一个原因,在不同的线程的处理事情,虽然,上面的例子就是这样,会有使用线程这样的事情没有意义的,但如果你想运行一个任务并且不锁定用户界面,那么这将很好地利用线程。

另外值得注意的是,从任务获取结果将锁定调用线程,直到它完成。