gpt4 book ai didi

c# - TaskScheduler 始终在同一个线程上运行

转载 作者:行者123 更新时间:2023-11-30 18:18:39 24 4
gpt4 key购买 nike

我有一些使用 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");
}
}

好吧,对于您的生产代码,您可以做一些不同的事情,但基本思想是有专门的线程来进行锁定和解锁,这样,来自哪个线程调用就变得不重要了应该锁定和解锁代码/资源的方法...

希望对你有帮助。

关于c# - TaskScheduler 始终在同一个线程上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40984801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com