我需要在异步编程模型中为资源创建一个门,以便在任何给定时间只有一个线程可以访问资源。鉴于异步编程模型,我希望对资源的剩余请求进行排队,这样我就不会在等待资源可用时使用线程。
我看过并在Jeffrey Richter的电源线程库中找到了一个读写器门,但我正在寻找一些不同的东西。
我有一个模糊的想法,我希望门类的签名看起来像这样:
public class Gate
{
public IAsyncResult BeginEnterGate(AsyncCallback callback, object state)
{
...
}
public GateRequest EndEnterGate(IAsyncResult result)
{
return ...;
}
}
返回的门请求应该是IDisposable,并且在处理时,门将允许下一个线程使用该资源。
public class GateRequest : IDisposable
{
public void Dispose()
{
/* release gate */
}
}
有了这个,我就可以利用Jefrey Ricters这样的权力来解读图书馆了:
public IAsyncResult BeginFoo(string bar, AsyncCallback callback, object state)
{
AsyncEnumerator ae = new AsyncEnumerator();
return ae.BeginExecute(DoFoo(ae, bar), callback, state);
}
public void EndFoo(IAsyncResult result)
{
AsyncEnumerator.FromAsyncResult(result).EndExecute(result);
}
private IEnumerator<int> DoFoo(AsyncEnumerator ae, string bar)
{
gate.BeginEnterGate(ae.End(), null);
yield return 1;
var gateReleaser = gate.EndEnterGate(ae.DequeueAsyncResult());
using (gateReleaser)
{
/* do work related to the resource */
}
}
我可能会以某种方式盲目地解决这个问题,所以我也愿意接受其他建议。
答案 0 :(得分:2)
My Power Threading Library有一个SyncGate类,它与AsyncEnumerator集成在一起。我认为它提供了您想要的API。