none
有關Thread的問題 RRS feed

  • 問題

  • 我的程式因為有用到不同的執行緒,因為我透過用委派的方法來到主執行緒進行動作…程式如下…

    程式內容動作主要為:回到主執行緒中把Form1中的Textbox1的值每一秒加1而以。

    程式碼如下:
    Imports System.Threading
    Public Class Form1
    Private addDataRunner As Thread
    Public Delegate Sub AddDataDelegate()
    Public addDataDel As AddDataDelegate = New AddDataDelegate(AddressOf AddData)

    Dim Count As Integer = 0

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Try
    Me.addDataRunner.Abort()
    'MsgBox(Me.addDataRunner.ThreadState.ToString)
    Catch ex As Exception

    End Try

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim addDataThreadStart As New ThreadStart(AddressOf AddDataThreadLoop)
    addDataRunner = New Thread(addDataThreadStart)
    Me.addDataRunner.Start()
    End Sub

    Private Sub AddDataThreadLoop()
    Try
    While True

        Me.TextBox1.Invoke(addDataDel)
        Thread.Sleep(1000)
    End While
    Catch ex As Exception
       MsgBox(ex.ToString)
    End Try
    End Sub

    '呼叫新增資料函式
    Public Sub AddData()
    Try
        Count += 1
        Me.TextBox1.Text = Count
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
    End Sub

    End Class

    問題:目前遇到的問題是,我直接按右上方的x的話,則會出現錯誤…

    錯誤指令1:
    System.Threading.ThreadAbortException:執行緒已經中止。
    於System.Threading.Thread.SleepInternal(Int32 millisecondsTimeout)
    於System.Threading.Thread.Sleep(Int32 millisecondsTimeout)


    錯誤指令2:
    System.Threading.ThreadAbortException:執行緒已經中止。
    於System.Threading.WaitHandle.WaitOncNative(Safe WaitHandle waitHandle,UInt32 millisecondsTimeout,Bollean hasThreadAffinity,Boolean exitContext)
    於System.Threading.WaitHandle.WaitOne(Int64 timeout,Bollean exitContext)
    於System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout,Boolean exitContext)
    .
    .
    於System.Windows.Forms.Control.Invoke(Delegate method,Object[] args)
    於System.Windows.Forms.Control.Invoke(Delegate method)

    想問一下我是那個地方忘了關閉嗎…要怎麼解決這個問題??
    謝謝…
    2009年3月24日 上午 07:15

解答

  • 因為那個執行緒還在執行中,而主執行緒卻結束了,
    第一個狀況是在Sleep的情況下停止了,因為Thread.Abort會引發ThreadAbortException,
    所以你必須要在sub中增加欄截此一問題的代碼
    Try
    While True

        Me.TextBox1.Invoke(addDataDel)
        Thread.Sleep(1000)
    End While
    Catch ex1 As ThreadAbortException
    '不要做任何事
    Catch ex As Exception
       MsgBox(ex.ToString)
    End Try

    第二個狀況在Invoke發生,因為沒東西可以Invoke了
    這邊可以加上欄截ObjectDisposedException
    Try
    While True
        Me.TextBox1.Invoke(addDataDel)
        Thread.Sleep(1000)
    End While
    Catch ex0 AS ObjectDisposedException
    '不要做任何事
    Catch ex1 As ThreadAbortException
    '不要做任何事
    Catch ex As Exception
       MsgBox(ex.ToString)
    End Try

    對了,另一個Sub最好也加上去
    希望對你有幫助

    • 已標示為解答 justinwu 2009年3月25日 上午 02:36
    2009年3月24日 上午 09:29
    版主

所有回覆

  • HI,

    建議把:
    Thread.Sleep(1000)
    拿掉再試試看
    2009年3月24日 上午 08:19
  • 因為那個執行緒還在執行中,而主執行緒卻結束了,
    第一個狀況是在Sleep的情況下停止了,因為Thread.Abort會引發ThreadAbortException,
    所以你必須要在sub中增加欄截此一問題的代碼
    Try
    While True

        Me.TextBox1.Invoke(addDataDel)
        Thread.Sleep(1000)
    End While
    Catch ex1 As ThreadAbortException
    '不要做任何事
    Catch ex As Exception
       MsgBox(ex.ToString)
    End Try

    第二個狀況在Invoke發生,因為沒東西可以Invoke了
    這邊可以加上欄截ObjectDisposedException
    Try
    While True
        Me.TextBox1.Invoke(addDataDel)
        Thread.Sleep(1000)
    End While
    Catch ex0 AS ObjectDisposedException
    '不要做任何事
    Catch ex1 As ThreadAbortException
    '不要做任何事
    Catch ex As Exception
       MsgBox(ex.ToString)
    End Try

    對了,另一個Sub最好也加上去
    希望對你有幫助

    • 已標示為解答 justinwu 2009年3月25日 上午 02:36
    2009年3月24日 上午 09:29
    版主
  • 謝謝…原來是Abort都會丟出Exception,所以要用另外的Exception來處理…了解了…感謝!
    2009年3月25日 上午 02:36
  • 嗯..忘了說在MSDN裡面有說明這一段
    Thread.Abort 方法
    http://msdn.microsoft.com/zh-tw/library/system.threading.thread.abort(VS.80).aspx
    2009年3月25日 上午 04:56
    版主