我做了一些研究,並環顧四周,似乎要做到這一點的方法是使用AutoResetEvent。我很快把它放在一起,它似乎工作,似乎是線程安全的。我可以有一些反饋嗎?編輯: 嗨,再次。我已經使用了反饋,我對我的實現感到滿意。只是我想補充的一件小事,當我暫停時,我想等待確保線程已經暫停並且不再工作。那可能嗎?也許我應該只更換暫停和恢復,只有開始和停止,然後停止做一個thred.join()。註釋?.Net Thread.Suspend已過時。尋找替代品
2
A
回答
1
一旦調用exit,ManualResetEvent就會被拋棄,並且在調用時可能會在實例方法上拋出異常。 - >在某些情況下,這可能不是理想的
class Program {
static void Main(string[] args) {
//NOTE: if worker goes out of scope it will be collected -> ex: promote to field in real use
Worker worker = new Worker();
System.Threading.Thread workerThread = new System.Threading.Thread(new System.Threading.ThreadStart(worker.DoWork));
workerThread.IsBackground = true;
workerThread.Start();
// test
worker.Resume();
System.Threading.Thread.Sleep(2000);
worker.Pause();
System.Threading.Thread.Sleep(2000);
worker.Resume();
System.Threading.Thread.Sleep(2000);
worker.Exit();
System.Threading.Thread.Sleep(5000);
}
}
public class Worker {
private readonly System.Threading.ManualResetEvent _Gate;
private bool _IsActive;
public Worker() {
_Gate = new System.Threading.ManualResetEvent(false);
_IsActive = true;
}
public void DoWork() {
while (IsActive) {
_Gate.WaitOne();
// do work
// can yield the thread
System.Threading.Thread.Sleep(1);
}
// dispose
_Gate.Close();
}
private bool IsActive {
get {
lock (_Gate) {
return _IsActive;
}
}
}
public void Pause() {
_Gate.Reset();
}
public void Resume() {
_Gate.Set();
}
public void Exit() {
lock (_Gate) {
_IsActive = false;
}
}
}
0
看起來過於複雜
和
public void StopProcessing()
{
workerThread.Interrupt();
workerThread.Join();
}
可以,如果你只是讓線程退出的方法
0
如果改爲使用ManualResetEvent的,你可以刪除_continueProcessing變量被刪除。在設置中,只需調用事件的Set或Reset。在getter中,你可以返回aResetEvent.WaitOne(0)。然後,您可以在DoSomeProcessing結束時刪除一段代碼,以便在處理應該持續時設置該事件。另外,因爲ManualResetEvent本身是線程安全的,您可以完全刪除您的鎖定。
關於退出DoSomeProcessing方法。也許最好的辦法是使用你設置的標誌來告訴循環退出,在循環開始時用鎖來測試標誌(是的,你現在必須把一些鎖定回去),當你想要放棄,您設置標誌,然後設置事件。
或者,您可以使用另一個事件來指示循環應該退出並更改您的等待以使用WaitHandle.WaitAny()。
相關問題
- 1. 尋找Aspose .NET幻燈片替代品
- 2. Bug尋找替代品?
- 3. 尋呼替代品
- 4. 尋找一個Java Graphics的替代品
- 5. 尋找JasperReports的替代產品
- 6. 正在尋找w3c.dom.Node的替代產品
- 7. 在Win32下尋找TortoiseHG的替代品
- 8. 正在尋找NMS的替代品FormMail.pl
- 9. 正在尋找Instamapper的替代產品
- 10. 實現datalist並尋找替代品
- 11. 尋找C#的替代品System.Text.ASCIIEncoding()
- 12. 我在尋找CHM替代品
- 13. 尋找替代cfdump
- 14. Thread.Suspend()和Thread.Resume()的替代方式;
- 15. Thread.Suspend()方法的替代方法
- 16. Node.JS尋找替代socket.IO
- 17. THREE.js:尋找替代MeshFaceMaterial
- 18. 尋找替代賬戶,SQL
- 19. 正在尋找IBM RAD的替代產品
- 20. 標題位置一次不重定向,尋找替代品
- 21. SciPy interp2d內存錯誤,尋找替代品
- 22. 全文索引呆滯。尋找替代品
- 23. RExcel有用嗎?或者我應該尋找替代品
- 24. Xeround停產 - 2周後尋找替代品
- 25. 正在尋找一個eval的替代品
- 26. SetupSet()已過時。代替什麼?
- 27. getc已過時;使用STDIN.getc代替
- 28. Kibana替代品
- 29. .NET WebBrowser控件的替代品?
- 30. TcpClient的.NET核心替代品
我不知道在ContinueProcessing setter中是否會遇到訂購問題? – ziya 2010-02-12 12:36:45
你設置_continueProcessing兩次 - 鎖定和解鎖 – tanascius 2010-02-12 12:37:38
也許你應該把所有的鎖(在ContinueProcessing setter中)或考慮一種不使用標誌的方式? http://dotnet.org.za/markn/archive/2008/10/21/net-memory-model-bytecode-reordering.aspx – ziya 2010-02-12 12:44:52