ManualResetEvent verseus Async/Await

本文关键字:Await Async verseus ManualResetEvent | 更新日期: 2023-09-27 18:14:02

我有下面的类来加入/取消队列对象(等待响应)。

public class PendingQueue<TValue> : Queue<TValue>, IDisposable
{
    private ManualResetEvent QueueDone = new ManualResetEvent(false);
    public PendingQueue() : base() { }
    public new void Enqueue(TValue item)
    {
        base.Enqueue(item);
        this.QueueDone.Set();
    }
    public new TValue Dequeue()
    {
        this.QueueDone.WaitOne();
        TValue result = base.Dequeue();
        this.QueueDone.Reset();
        return result;
    }
    public void Dispose()
    {
        this.QueueDone.Dispose();
    }
}
基本上,当我想"停止"脚本并等待响应时,我只需使用以下代码:
   public bool SomeMethod()
{
    this.PendingQueue = new PendingQueue<bool>();
    return this.PendingQueue.Dequeue();
}

然后,我简单地使用PendingQueue来为一个布尔对象排队,并返回该对象。

现在,我的问题是,它使整个线程卡住。我使用这个脚本(在c#中使用CodeDomProvider编译)。我曾经使用TaskCompletionSource,然后使用await/async,但我想使用这个类,因为我真的不喜欢任务。

如何使卡住整个线程像async/await ?我不想在不同的线程上运行脚本(当我执行它们时)。

谢谢。

ManualResetEvent verseus Async/Await

首先,如果您以任何其他方式使用PendingQueue,那么它就会被破坏。例如,如果您有两个项目在退出队列之前进入队列。

现在,我的问题是,它使整个线程卡住。

这就是ManualResetEvent和其他传统线程同步原语的全部意义。

如何使它不卡住整个线程像async/await吗?

您使用async/awaitTask s。这就是他们存在的意义。