[英]TaskScheduler to always run on the same thread
我有一些使用ReaderWriterLockSlim的代碼。 我在構造某個對象時獲取了一個寫鎖定,並在該對象稍后處理時釋放它。 但是,由於這些調用的來源,我無法保證它們將位於同一個線程上,這是ReaderWriterLockSlim的要求。
我相信一個合理的解決方案是在專用線程上運行對象的構造和處理,並讓調用代碼等待該任務完成(但保持線程處於活動狀態)。 這看起來很混亂,但如果沒有大規模重組我們的代碼,我就無法想到另一種方法。
是否有一個現有的TaskScheduler子類允許我在同一個線程上運行兩個任務?
我當然願意采取另一種做法的范例。
我遇到了類似的問題,所以我希望我的解決方案能夠幫到你。
基本上,問題是ReaderWriterLockSlim具有線程親和性,這意味着獲得鎖的線程是唯一可以釋放它的線程。
解決方法是創建一個更專用的線程,但與您的建議相反,此線程將專門用於獲取和釋放鎖。
我想你的代碼看起來像這樣:
public class ClassUsingReaderWriterLockSlim
{
private ReaderWriterLockSlim rwsLock;
public void MethodThatAcquiresLock()
{
rwsLock.EnterWriteLock();
}
public void MethodThatReleasesLock()
{
rwsLock.ExitWriteLock();
}
}
解決問題的代碼如下所示:
public class ClassUsingReaderWriterLockSlim
{
private ReaderWriterLockSlim rwsLock;
Thread dedicatedThreadForReaderWriterLockSlim;
Queue<string> commandsForDedicatedThread;
public ClassUsingReaderWriterLockSlim()
{
commandsForDedicatedThread = new Queue<string>();
dedicatedThreadForReaderWriterLockSlim = new Thread(ThreadFunction);
dedicatedThreadForReaderWriterLockSlim.Start();
}
private void ThreadFunction(object obj)
{
while (!terminatingCondition)
{
// Wait until something is in queue...
if (commandsForDedicatedThread.Count > 0)
{
switch (commandsForDedicatedThread.Dequeue())
{
case "ENTER LOCK":
rwsLock.EnterWriteLock();
case "EXIT LOCK":
rwsLock.EnterWriteLock();
default:
// Do nothing...
}
}
}
}
public void MethodThatAcquiresLock()
{
commandsForDedicatedThread.Enqueue("ENTER LOCK");
}
public void MethodThatReleasesLock()
{
commandsForDedicatedThread.Enqueue("EXIT LOCK");
}
}
那么,對於你的生產代碼,你會使這個有點不同,但基本的想法是有專門的線程,將進行鎖定和解鎖,並以這種方式,從哪個線程調用來到方法是不重要的應該鎖定和解鎖代碼/資源......
希望這對你有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.