相关疑难解决方法(0)

ManualResetEvent与Thread.Sleep

我实现了以下后台处理线程,其中JobsQueue<T>:

static void WorkThread()
{
    while (working)
    {
        var job;

        lock (Jobs)
        {
            if (Jobs.Count > 0)
                job = Jobs.Dequeue();
        }

        if (job == null)
        {
            Thread.Sleep(1);
        }
        else
        {
            // [snip]: Process job.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这产生正在进入作业时之间的noticable延迟,当他们实际上开始运行(作业批次在一旦进入,而每个工作只是[比较]小)的延迟是不是一个大问题,但我开始思考这个问题,并做了以下改变:

static ManualResetEvent _workerWait = new ManualResetEvent(false);
// ...
    if (job == null)
    {
        lock (_workerWait)
        {
            _workerWait.Reset();
        }
        _workerWait.WaitOne();
    }
Run Code Online (Sandbox Code Playgroud)

线程添加作业现在锁定_workerWait_workerWait.Set()在完成添加作业时调用.这个解决方案(貌似)立即开始处理工作,延迟完全消失.

我的问题部分是"为什么会发生这种情况?",被认为Thread.Sleep(int)可以比你指定的更长时间地睡眠,部分是"如何ManualResetEvent实现这种性能水平?".

编辑:由于有人询问了排队项目的功能,现在它和目前的完整系统一起.

public void RunTriggers(string data)
{
    lock …
Run Code Online (Sandbox Code Playgroud)

c# multithreading sleep manualresetevent

12
推荐指数
2
解决办法
2万
查看次数

标签 统计

c# ×1

manualresetevent ×1

multithreading ×1

sleep ×1