当前位置: 代码迷 >> VB Dotnet >> 最简单的线程有关问题
  详细解决方案

最简单的线程有关问题

热度:74   发布时间:2016-04-25 02:06:40.0
最简单的线程问题
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For i = 1 To 10000
            Call sub_datadown()
        Next
    End Sub

sub_datadown()为下载子过程,下载完成就更新下载列表,提示完成更新。现在想添加一个button2,实现点击button2,取消下载,用close()的话会结束程序,但是明明没有更新完,列表却更新了,所以想用个线程来解决,求指导,网上的线程入门都看不懂,哎
------解决思路----------------------

        private void button1_Click(object sender, EventArgs e)
        {
            Thread th = new Thread(new ThreadStart(new Action(() =>
                {
                    for (int i = 1; i <= 1000; i++)
                    {
                        sub_datadown();
                    }
                })));
            th.Start();
        }

        bool _flag = true;
        private void sub_datadown()
        {
            if (_flag)
            { 
              //...
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            _flag = false;
        }

------解决思路----------------------
private Work as boolean=true    
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For i = 1 To 10000
if Work=True then
            Call sub_datadown()
else
exit sub 
end if
        Next
    End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Work=False
End Sub

------解决思路----------------------
把这个类添加到组件类内的

Imports System.Threading
Imports System.ComponentModel
Public Class Component1

    Private Count1 As Integer
    Private ProgressBar1 As ProgressBar
    Public Property _ProgressBar1() As ProgressBar
        Get
            Return ProgressBar1
        End Get
        Set(ByVal value As ProgressBar)
            ProgressBar1 = value
        End Set
    End Property

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

        Dim Boolean1 As Boolean
        Dim Sum1 As Integer = 1
      
        Do
            '  Call sub_datadown()  '这里添加要运行的后台操作代码
            BackgroundWorker1.ReportProgress(Sum1)
            Thread.Sleep(5)
            If Sum1 = Count1 Then Exit Do

            Boolean1 = BackgroundWorker1.CancellationPending
            e.Cancel = Boolean1
            Sum1 += 1
        Loop Until Boolean1


    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        If e.Cancelled Then
            MsgBox("请求的任务已被中断")
        Else
            MsgBox("请求的任务已完成")
        End If
        '这里还可以完成后的操作,更新等过程。还可以直接使用UI线程上的控件

    End Sub

    Public Sub MySub()
        Count1 = 10000  '设置要循环的次数变量
        ProgressBar1.Minimum = 1
        ProgressBar1.Maximum = Count1
        BackgroundWorker1.WorkerSupportsCancellation = True
        BackgroundWorker1.WorkerReportsProgress = True
        BackgroundWorker1.RunWorkerAsync()

    End Sub
    Public Sub Calcen1()
        BackgroundWorker1.CancelAsync()
    End Sub

End Class
'这个类是窗体的
Public Class Form1
 
    Private Cla1 As New Component1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Cla1._ProgressBar1 = Me.ProgressBar1
        Cla1.MySub()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Cla1.Calcen1()
    End Sub
End Class

  相关解决方案