C# 离开WaitOne时获取锁

C# 离开WaitOne时获取锁,c#,locking,atomic,C#,Locking,Atomic,我有一个任务调度器,实现方式如下: private readonly List<Task> mTasks = new List<Task>(); private readonly ManualResetEvent mNoTaskEvent = new ManualResetEvent(false); public void AddTask(Task task) { lock (mTasks) { mTasks.Add(

我有一个任务调度器,实现方式如下:

  private readonly List<Task> mTasks = new List<Task>();
  private readonly ManualResetEvent mNoTaskEvent = new ManualResetEvent(false);

  public void AddTask(Task task)
  {
     lock (mTasks)
     {
        mTasks.Add(task);
        mNoTaskEvent.Set();
     }
  }

  public void RemoveTask(Task task)
  {
     lock (mTasks)
     {
        mTasks.Remove(task);
        if (mTasks.Count == 0)
           mNoTaskEvent.Reset();
     }
  }

  void BackgroundThreadProc()
  {
     while (mRunning)
     {
        mNoTaskEvent.WaitOne();

        if (!mRunning) break;

        Task nextTask;

        lock (mTasks)
        {
           mTasks.Sort(...);
           nextTask = mTasks.First();
        }

        nextTask.Run();
     }
  }
private readonly List mTasks=new List();
private readonly ManualResetEvent MNOTaskeEvent=新的ManualResetEvent(假);
公共无效添加任务(任务任务)
{
锁(mTasks)
{
mTasks.Add(任务);
mNoTaskEvent.Set();
}
}
公共void RemoveTask(任务)
{
锁(mTasks)
{
mTasks.Remove(任务);
如果(mTasks.Count==0)
mNoTaskEvent.Reset();
}
}
void BackgroundThreadProc()
{
同时(运行)
{
mNoTaskEvent.WaitOne();
如果(!m运行)中断;
任务下一任务;
锁(mTasks)
{
mTasks.Sort(…);
nextTask=mTasks.First();
}
nextTask.Run();
}
}
mNoTaskEvent允许在没有可用任务时阻止后台线程。 如果另一个线程删除“mNoTaskEvent.WaitOne()”和“lock(mTasks)”之间的所有剩余任务,则存在争用条件

在离开mNoTaskEvent.WaitOne()时,如何以原子方式获取mTasks锁

编辑
pthread API有一个函数,它完全满足我的需要:

一个简单的解决方案是再次检查计数:

    lock (mTasks)
    {
       if (mTasks.Count < 1)
         continue;

       mTasks.Sort(...);
       nextTask = mTasks.First();
    }
锁(mTasks)
{
如果(mTasks.Count<1)
继续;
mTasks.Sort(…);
nextTask=mTasks.First();
}

使用Monitor.Wait():

while(mRunning)
{
//mNoTaskEvent.WaitOne();
如果(!m运行)中断;
任务下一任务;
锁(mTasks)
{
而(mTasks.Count<1)
{
监视器。等待(mTasks);
如果(!m运行)中断;
}
...     
}
公共无效添加任务(任务任务)
{
锁(mTasks)
{
mTasks.Add(任务);
//mNoTaskEvent.Set();
监测脉冲(mTasks);
}
}

停止整个链时,您还需要脉冲()。

一个简单的解决方案是再次检查计数:

    lock (mTasks)
    {
       if (mTasks.Count < 1)
         continue;

       mTasks.Sort(...);
       nextTask = mTasks.First();
    }
锁(mTasks)
{
如果(mTasks.Count<1)
继续;
mTasks.Sort(…);
nextTask=mTasks.First();
}

使用Monitor.Wait():

while(mRunning)
{
//mNoTaskEvent.WaitOne();
如果(!m运行)中断;
任务下一任务;
锁(mTasks)
{
而(mTasks.Count<1)
{
监视器。等待(mTasks);
如果(!m运行)中断;
}
...     
}
公共无效添加任务(任务任务)
{
锁(mTasks)
{
mTasks.Add(任务);
//mNoTaskEvent.Set();
监测脉冲(mTasks);
}
}

当停止整个链时,您还需要脉冲()。

您看过
Monitor.Wait()
了吗?是的,但我看不出它对我有什么帮助,您有主意吗?它将替换ResetEvent,而不是增加它。您看过
Monitor.Wait()了吗
对于这一点?是的,但我不认为它能帮我什么忙,你有主意吗?它将取代ResetEvent,而不是增强它。是的,当然:-),但这个问题的目标更多的是找到一个整体问题的优雅解决方案,而不是这个实际案例。我不确定“整体问题的优雅解决方案”存在。我正在寻找类似C函数“pthread_cond_wait”的东西,该函数[1]释放一个拥有的互斥并在条件[2]下等待唤醒并获取互斥锁,1和2是原子的。您使用监视器的解决方案非常好,谢谢!是的,当然:-),但是这个问题的目标更多的是为整个问题找到一个优雅的解决方案,而不是实际情况。我不确定是否存在“整体问题的优雅解决方案”。我正在寻找类似C函数的东西“pthread_cond_wait”[1]释放一个拥有的互斥体并在条件下等待,[2]唤醒并获取互斥体,1和2是原子的。您的监视器解决方案非常好,谢谢!