在C#中创建非阻塞异步门

时间:2011-01-09 14:31:02

标签: c# multithreading asynchronous threadpool nonblocking

我需要在异步编程模型中为资源创建一个门,以便在任何给定时间只有一个线程可以访问资源。鉴于异步编程模型,我希望对资源的剩余请求进行排队,这样我就不会在等待资源可用时使用线程。

我看过并在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 */
  }
}

我可能会以某种方式盲目地解决这个问题,所以我也愿意接受其他建议。

1 个答案:

答案 0 :(得分:2)

My Power Threading Library有一个SyncGate类,它与AsyncEnumerator集成在一起。我认为它提供了您想要的API。