none
如何將某個方法傳給特定執行緒執行? RRS feed

  • 問題

  • 各位先進  大家好,

    我想請教,我建立一個執行緒,叫Thread_A好了,專門在某個函式中收資料(迴圈),若此時有需求要將某個函式讓Thread_A執行,該如何做呢?我目前的作法是將該函式封裝起來(handler),並置入一個Queue之後,然後在執行緒的函式最上層檢視Queue,是否有工作待做,若有,就取出handler,並呼叫,可是感覺怪怪的。我查msdn,好像沒有像是Dispatcher.BeginInvoke等方法,還是我忽略了那裡,請各位先進不吝指教。

    謝謝!

    2010年9月21日 上午 04:01

解答

  • 你這些儲存資料的函式是相同不相同

    如果相同, 你可以建一個全域的Queue, 把即將要存入資料庫的資料先擺在Queue中, 統一用同一支Method從Queue中讀取再存入就好.

    意即不論這資料儲存的需求由哪裡觸發, 都只是做存到Queue中的動作

    如果不同,  建議你採不同的Thread來做.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 Mars0325 2010年9月21日 上午 08:00
    2010年9月21日 上午 07:43
    版主

所有回覆

  • 宣告委派, 然後將函式傳入(但這些函式的參數必須符合你宣告的委派), 在Thread中Invoke

    ex: ( 我用VB比較熟, 你可能要自己查資料轉成C#)

    Public Class Form1
        Dim myThread As New System.Threading.Thread(AddressOf ThreadTest)
        Public Delegate Sub InvokeTest(ByVal State As Object)
        Dim myInvoke As InvokeTest

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            myThread.IsBackground = True
            myThread.Start()
        End Sub
        Private Sub Test01(ByVal State As Object)
            MessageBox.Show("01")
        End Sub
        Private Sub Test02(ByVal State As Object)
            MessageBox.Show("02")
        End Sub
        Private Sub Test03(ByVal State As Object)
            MessageBox.Show("03")
        End Sub
        Private Sub ThreadTest(ByVal State As Object)
            While True
                If Not myInvoke Is Nothing Then
                    myInvoke.Invoke(Nothing)
                    myInvoke = Nothing
                End If
                System.Threading.Thread.Sleep(10)
            End While
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            myInvoke = AddressOf Test01
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            myInvoke = AddressOf Test02
        End Sub

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            myInvoke = AddressOf Test03
        End Sub
    End Class


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年9月21日 上午 05:09
    版主
  • Bill大,謝謝回應。

    這個方法是指Thread還是得主動寫Code來偵測是不是有函式(handler)要執行,但若不主動偵測的情況該如何做呢?

    類似可以附加工作(handler)到該執行緒,而該執行緒會在適當時機執行。

    就像是WPF中的UI Dispatcher的方法:Invoke(handler),其handler一定是Dispatcher所屬的執行緒呼叫。

     

    謝謝!

    2010年9月21日 上午 06:44
  • 不太懂, 你的原意不就是在一個Thread中跑While迴圈, 然後偵測有沒有Method要執行嗎 ?

    如果不是要在Thread中非寫一個While 繞來繞去不可..那就直接將委派傳給Thread就行了. 也就是你每click 一次Button , 就產生一個新的Thread, 然後將該Method 委派傳進去.

    Method執行完Thread就結束.

     

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年9月21日 上午 07:16
    版主
  • 抱歉,說得不清楚。

    我的需求是這樣的,有一個執行緒(執行緒A)執行一個函式,這個函式是while迴圈,

    不斷的將從網路進來的資料存入到資料庫之中,這個執行緒只有在應用程式結束時才會關閉。

     

    另外,但也有其他的執行緒(像是UI)也"觸發"了很多關於存資料的函式,而這些"觸發"我希望仍由執行緒A來執行。

     

    就像是WPF中,對於要修改UI的方法,都要經由UI的Dispatcher呼叫一樣。

     

    2010年9月21日 上午 07:37
  • 你這些儲存資料的函式是相同不相同

    如果相同, 你可以建一個全域的Queue, 把即將要存入資料庫的資料先擺在Queue中, 統一用同一支Method從Queue中讀取再存入就好.

    意即不論這資料儲存的需求由哪裡觸發, 都只是做存到Queue中的動作

    如果不同,  建議你採不同的Thread來做.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 Mars0325 2010年9月21日 上午 08:00
    2010年9月21日 上午 07:43
    版主
  • 了解了,感謝 Bill 大
    2010年9月21日 上午 08:01