簡體   English   中英

TaskScheduler總是在同一個線程上運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM