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 ?我不想在不同的线程上运行脚本(当我执行它们时)。
谢谢。
首先,如果您以任何其他方式使用PendingQueue
,那么它就会被破坏。例如,如果您有两个项目在退出队列之前进入队列。
现在,我的问题是,它使整个线程卡住。
这就是ManualResetEvent
和其他传统线程同步原语的全部意义。
如何使它不卡住整个线程像async/await吗?
您使用async
/await
和Task
s。这就是他们存在的意义。