2015-05-08 30 views
0

在.net中重用線程的正確方法是什麼?我知道線程池做到了,但我不知道如何。我已經有很多(100+)線程的服務器代碼工作得很好,但目前我有一個新的場景,我需要重複使用線程而不是針對同一個動作,但針對不同的線程。重複使用線程以執行不同的操作

如果我有2個方法,我該如何重用映射到方法1的線程並將其映射爲運行方法2?

僞代碼:

var thread = new Thread(method1); 
do work with thread here 
done, now how do i reuse the thread but tell it which method to run without creating a new one? 

請注意,我不希望在如何做到這一點不使用線程的建議,我確實需要直接使用線程,無論是線程池,也沒有任務系統適合我使用案件根本(不願在這裏辯論)。我只是不確定如何幹淨地回收線程並將其映射到另一個函數以進行新的運行

+2

這是任務的用途。直接使用任務不是線程 – MikeSW

+0

@MikeSW「任務」是異步完成的工作單元的抽象。 'Thread'是一種創建線程異步執行工作的機制。 '任務'確實有一些內置的機制,可以使線程在機制隱藏的情況下工作,但它們並不總是足夠的。在某些情況下,您需要創建使用不同底層機制的其他工具。在這種情況下,他可能需要創建一個使用'Thread'創建'Tasks'的抽象。這並不意味着直接使用'Thread'是錯誤的。 – Servy

+0

@MikeSW如果你直到最後讀到這個問題,你纔會明白你的評論是毫無意義的。 –

回答

5

您只需編寫一個方法來完成一個工作單元,然後完成後再執行另一個工作。就Thread而言,它只是運行它的一個代表,就像它總是這樣。委託運行恰好做了兩次(或更多,因爲它可以繼續找工作)邏輯上將程序中的操作分開是它不知道(或關心)的事情。

一個常見的情況,或多或少是線程池所做的,就是讓一個「要做的事情」的隊列和只有一個循環的線程在循環的主體中從一個循環中抽取一個項目隊列並處理它。 (只要確保正確同步線程之間共享的數據即可。)

+0

與任務隊列方法一起,您可以將訪問者模式應用於您的任務。所以線程只是獲取下一個任務並調用它的「DoWork」方法。線程不關心任務是什麼,它只是知道它應該執行它。 –

+0

這隻會在我的場景是「做方法1,然後2」時才起作用,這是一個示例,在這裏我做了一個工作單元,然後線程不再使用,並且當另一個工作單元到達時,我需要能夠爲它回收一個線程。 –

+0

所以基本上我不得不安排結束代碼,但我自己的線程調度程序代碼,並執行當前的任務?聽起來過於複雜,但我想我應該預料到,我希望我錯過了一個thread.delegate - = currentmethod + = newmethod類型的功能,但我想我必須自己做這個 –

相關問題