vb.net使循环中的线程成为可能?

vb.net使循环中的线程成为可能?,vb.net,multithreading,Vb.net,Multithreading,我有下面的脚本,它创建了两个线程,正如你所看到的。问题是我希望这段代码更整洁,线程做得更好(比如一个循环),但我还没能创建它 现在,我对线程1和线程2进行了调暗,并为这两个线程提供了单独的函数。 我是vb.net的新手,所以请不要被击倒 如何将一个公共MaxThreads设置为integer=2(或其他形式) 然后才能 对于i作为1到MaxThreads '函数startthread1中现在有什么 下一个 公共类未选中的数据读取程序 Public ForceStop As Boolean=Fal

我有下面的脚本,它创建了两个线程,正如你所看到的。问题是我希望这段代码更整洁,线程做得更好(比如一个循环),但我还没能创建它

现在,我对线程1和线程2进行了调暗,并为这两个线程提供了单独的函数。 我是vb.net的新手,所以请不要被击倒

如何将一个公共MaxThreads设置为integer=2(或其他形式) 然后才能 对于i作为1到MaxThreads '函数startthread1中现在有什么 下一个

公共类未选中的数据读取程序
Public ForceStop As Boolean=False'在应用程序关闭时强制关闭
要检查和报告的“作为整数的公共取消选中项”
Public QueueList As New Dictionary(整型,整型)'此列表将包含地址簿ID和持有它的线程的编号
Public QueueProcessed As New Dictionary(整型,整型)'这将使我们能够更新Clientlistview
私有ds作为新数据集
作为SqlCeDataAdapter的专用da=新的SqlCeDataAdapter()
私有连接作为新的ConnectionClass
私有表为String=“uncheckItems”
'线程部分-我们有2个线程
将螺纹1调暗为螺纹。螺纹
将螺纹2调暗为螺纹。螺纹
公共副总监()
Do While ForceStop=False
如果QueueList.Count小于1,则
GetDatabaseSqlClientListUnCheckedItems()
PopulateQueueList()
StartThreads()
如果结束
线程。线程。睡眠(5000)
控制台写入线(“新一轮”)
环
端接头
私有子StartThreads()
StartThread1()
StartThread2()
端接头
私有子StartThread1()
Dim DS作为新的可靠流程
DS.id=5
DS.ThreadId=1
DS.QueueList=队列列表
AddHandler DS.淋浴Ror,淋浴RorThread1的地址
AddHandler DS.Stopit,StopThread1的地址
Thread1=新的System.Threading.Thread(DS.StartTimer的地址)
Thread1.IsBackground=True
尝试
Thread1.Start()
捕获e作为ThreadStateException
WriteLine(“捕获:{0}”,e.Message)
特例
WriteLine(“捕获:{0}”,例如Message)
结束尝试
端接头
私有子StartThread2()
Dim DS作为新的可靠流程
DS.id=5
DS.ThreadId=2
DS.QueueList=队列列表
AddHandler DS.淋浴Ror,淋浴RorThread1的地址
AddHandler DS.Stopit,StopThread1的地址
Thread2=新的System.Threading.Thread(DS.StartTimer的地址)
Thread2.IsBackground=True
尝试
Thread2.Start()
捕获e作为ThreadStateException
WriteLine(“捕获:{0}”,e.Message)
特例
WriteLine(“捕获:{0}”,例如Message)
结束尝试
端接头
私有子线程1(ByVal e作为异常,ByVal id作为整数)
Console.Write(例如ToString)
QueueList.Remove(id)
控制台写入(vbCrLf+“从主队列列表中删除”+CStr(id))
QueueProcessed.Add(id,CInt(GetCurrentUnixTimestamp()))
控制台写入(vbCrLf+“添加到已处理列表”+CStr(id))
端接头
私有子线程2(ByVal e作为异常,ByVal id作为整数)
Console.Write(例如ToString)
QueueList.Remove(id)
控制台写入(vbCrLf+“从主队列列表中删除”+CStr(id))
QueueProcessed.Add(id,CInt(GetCurrentUnixTimestamp()))
控制台写入(vbCrLf+“添加到已处理列表”+CStr(id))
端接头
私有子线程1()
Thread1.Abort()
端接头
私有子线程2()
Thread2.Abort()
端接头
私有子填充队列列表()
尺寸i为整数=1
如果ds.Tables(table).Rows.Count>0,则
对于ds.Tables(table).Rows中的每个irow作为数据行
尝试
如果QueueList.ContainsKey(CInt(irow(0))=False,则
i=i+1
如果i=3,那么
i=1
如果结束
QueueList.Add(CInt(irow(0)),i)
WriteLine(ControlChars.NewLine+“将项{0}添加到线程{1}”,irow(0),i)
如果结束
捕获e作为例外
Console.WriteLine(ControlChars.NewLine+“引发异常。发生以下错误:{0}”,e.Message)
结束尝试
下一个
如果结束
端接头

使用线程集合,而不是单独声明每个线程。大致如下:

    Dim m_threads As New List(Of Threading.Thread)
Dim m_maxThreads As Int32 = 5

Private Sub StartAllThreads()


    For pos As Int32 = 1 To m_maxThreads
        StartThread(pos)
    Next
End Sub

Private Sub StartThread(p_threadID As Int32)
    Dim tempThread As Threading.Thread
    Dim DS As New RelianProcess


    DS.id = 5
    DS.ThreadId = p_threadID
    DS.QueueList = QueueList

    tempThread = New System.Threading.Thread(AddressOf DS.StartTimer)
    m_threads.Add(tempThread)

    AddHandler DS.ShowError, AddressOf ShowErrorThread1
    AddHandler DS.Stopit, AddressOf StopThread1
    tempThread.IsBackground = True

    Try
        tempThread.Start()
    Catch e As ThreadStateException
        Console.WriteLine("Caught: {0}", e.Message)
    Catch ex As Exception
        Console.WriteLine("Caught: {0}", ex.Message)
    End Try

End Sub

建议:停止捕获异常,或者如果必须,至少输出ex.ToString(),而不是ex.Message,并且
Console.WriteLine
在WinForms应用程序中没有多大帮助。另外,看看任务类。很难有建设性,这不是好代码。改用BackgroundWorker。通过乔·达菲(Joe Duffy)的《Windows上的并发编程》(Concurrent Programming on Windows)等书自学。学习任务课。
    Dim m_threads As New List(Of Threading.Thread)
Dim m_maxThreads As Int32 = 5

Private Sub StartAllThreads()


    For pos As Int32 = 1 To m_maxThreads
        StartThread(pos)
    Next
End Sub

Private Sub StartThread(p_threadID As Int32)
    Dim tempThread As Threading.Thread
    Dim DS As New RelianProcess


    DS.id = 5
    DS.ThreadId = p_threadID
    DS.QueueList = QueueList

    tempThread = New System.Threading.Thread(AddressOf DS.StartTimer)
    m_threads.Add(tempThread)

    AddHandler DS.ShowError, AddressOf ShowErrorThread1
    AddHandler DS.Stopit, AddressOf StopThread1
    tempThread.IsBackground = True

    Try
        tempThread.Start()
    Catch e As ThreadStateException
        Console.WriteLine("Caught: {0}", e.Message)
    Catch ex As Exception
        Console.WriteLine("Caught: {0}", ex.Message)
    End Try

End Sub