- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我坚信通过创新进行学习。考虑到这一点,我着手实现自定义线程池。我为自己设定的目标如下:
public static class CustomThreadPool
{
static CustomThreadPool()
{
for (int i = 0; i < minThreads; i++)
_threads.Add(
new Thread(ThreadFunc) { IsBackground = true }
);
_threads.ForEach((t) => t.Start());
}
public static void EnqueWork(Action action)
{
_concurrentQueue.Enqueue(action);
_enqueEvent.Set();
}
private static void ThreadFunc()
{
Action action = null;
while (true)
{
_enqueEvent.WaitOne();
_concurrentQueue.TryDequeue(out action);
action();
}
}
private static ConcurrentQueue<Action> _concurrentQueue = new ConcurrentQueue<Action>();
private static List<Thread> _threads = new List<Thread>();
private static CountAutoResentEvent _enqueEvent = new CountAutoResentEvent();
private static object _syncObject = new object();
private const int minThreads = 4;
private const int maxThreads = 10;
public static void Test()
{
CustomThreadPool.EnqueWork(() => {
for (int i = 0; i < 10; i++) Console.WriteLine(i);
Console.WriteLine("****First*****");
});
CustomThreadPool.EnqueWork(() =>
{
for (int i = 0; i < 10; i++) Console.WriteLine(i);
Console.WriteLine("****Second*****");
});
CustomThreadPool.EnqueWork(() =>
{
for (int i = 0; i < 10; i++) Console.WriteLine(i);
Console.WriteLine("****Third*****");
});
CustomThreadPool.EnqueWork(() =>
{
for (int i = 0; i < 10; i++) Console.WriteLine(i);
Console.WriteLine("****Fourth*****");
});
CustomThreadPool.EnqueWork(() =>
{
for (int i = 0; i < 10; i++) Console.WriteLine(i);
Console.WriteLine("****Fifth*****");
});
}
}
public class CountAutoResentEvent
{
public void Set()
{
_event.Set();
lock (_sync)
_countOfSet++;
}
public void WaitOne()
{
_event.WaitOne();
lock (_sync)
{
_countOfSet--;
if (_countOfSet > 0)
_event.Set();
}
}
private AutoResetEvent _event = new AutoResetEvent(false);
private int _countOfSet = 0;
private object _sync = new object();
}
最佳答案
从我所见,我会说这是正确的。我喜欢您使用了ConcurrentQueue
并且没有打算实现自己的同步队列。那是一团糟,很可能不会像现有的那样快。
我只想指出,您的自定义“信号机制”实际上非常类似于信号量:一种锁,该锁允许多个线程进入关键部分。该功能已经存在于Semaphore类中。
关于.net - 学习实现线程池-使用autoresetevent时,信号事件丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8543646/
即使使用多年,我仍然不明白 AutoResetEvent 是如何工作的。 当谈到Set()时,是否应该有一部分代码在某处等待WaitOne()? 也就是说..如果在WaitOne()之前成功调用了Se
假设我正在处理来自多个线程的大量传入数据。当满足某些条件时,我可能希望这些数据充当特定操作的触发器。然而, Action 不可重入;所以同一个触发器被快速连续触发两次应该只会导致 Action 运行一
我有两个方法,ProcessQueue 和 AddToQueue,它们发生在不同的线程上。有时我会尝试在将项目添加到队列之前处理队列,此时我想等待将项目添加到队列中。我还想确保我永远不会遇到这样的情况
我在处理来自外部类的线程时遇到问题。我在线程方面还很陌生,所以很多事情对我来说仍然是个谜,所以请记住这一点。 我做了我的研究,发现了很多关于它的主题,包括: How to Sleep a thread
super 简单的问题,但我只是想澄清一下。我希望能够使用 AutoResetEvent 重新启动线程,因此我将以下方法序列调用到我的 AutoResetEvent。 setupEvent.Reset
我有两种与以下方法类似的方法。在 MainThreadDoWork 方法中,无论 OtherThreadWork 方法中的 autoResetEvent.Set() 是什么,循环都会完成执行。知道这个
private ConcurrentQueue _queue = new ConcurrentQueue(); private AutoResetEvent _queueNotifier = new
我在类库中有以下代码。然后我等待回拨到我的主应用程序中。我正在进行 DownloadStringAsync 调用,因此我必须等待几秒钟才能在完成后获得回调。我有 3 个这样的调用要等待,所以在我的主应
使用 Xamarin.Forms(适用于 iOS),我尝试实现在继续之前等待用户确认已设置 GeoLocation 权限的功能。 我尝试实现这一点的方法是让线程等待直到使用 AutoResetEven
有人可以介绍 AutoResetEvent.Reset() 方法的用例吗?我什么时候以及为什么要使用这种方法?我了解 WaitOne 和 Set,但这对我来说还不清楚。 最佳答案 是的,每当等待事件的
我可能超出了 AutoResetEvent 的正确设计范围,但不太清楚该求助于什么。我想要这种行为: var autoResetEvent = new AutoResetEvent(false); a
我一直在使用 AutoResetEvent 在线程之间进行同步。 一些线程(A-F)调用 autoresetevent.WaitOne();在等待另一个线程 (X) 完成其工作时 当拥有 autore
考虑以下模式: private AutoResetEvent signal = new AutoResetEvent(false); private void Work() { while (
我正在 .NET (C#) 中的多线程服务器中创建一些“工具”。 检查 .NET ManualResetEvent 的值相当容易,无需担心更改值: aManualResetEvent.WaitOne(
假设我必须在 .Net 3.5 SP1 中编排同步算法,标题中列出的任何同步原语都非常适合该任务。 从性能的角度来看,是否有任何一个比其他的性能更好? 我问这个是因为我已经编码了一段时间,但对这个主题
我在 RegisterWaitForSingleObject 中阅读过: http://www.albahari.com 而且我不明白我什么时候更喜欢使用 AutoResetEvent 而不是 Reg
我正在尝试实现AutoResetEvent。为此,我使用一个非常简单的类: public class MyThreadTest { static readonly AutoResetEvent
我正在尝试使用生产者消费者模式来处理和保存一些数据。我正在使用 AutoResetEvent 在两个 therads 之间发送信号,这里是我的代码 这里是生产者函数 public Results[]
我正在阅读 MSDN 上的 AutoResetEvent 文档,随后的警告有点让我困扰...... “重要:不能保证每次调用 Set 方法都会释放一个线程。如果两次调用距离太近,以至于第二次调用发生在
是c# ManualResetEvent和 AutoResetEvent创建或维护类的成本很高吗? 它们是否消耗某种有限的 Windows 内核资源,如果是,它的限制程度如何? 例如如果我的代码可以每
我是一名优秀的程序员,十分优秀!