2011-01-09 19 views
2

非同期プログラミングモデルでリソースへのゲートを作成して、1つのスレッドだけがリソースにアクセスできるようにする必要があります。非同期プログラミングモデルでは、リソースへの残りの要求をキューに入れて、リソースが使用可能になるのを待ってスレッドをブロックしないようにしたいと考えています。C#で非ブロッキング非同期ゲートを作成する

私はJeffrey Richterのパワースレッディングライブラリのリーダー/ライターのゲートを見ましたが、少し違ったものを探しています。

私はゲートクラスのシグネチャは次のようになりたい曖昧なアイデアがあります。返されたゲート要求はIDisposableをすべきであり、配置されたときにゲートが次のスレッドを使用できるようになる

public class Gate 
{ 
    public IAsyncResult BeginEnterGate(AsyncCallback callback, object state) 
    { 
    ... 
    } 

    public GateRequest EndEnterGate(IAsyncResult result) 
    { 
    return ...; 
    } 
} 

をリソース。

public class GateRequest : IDisposable 
{ 
    public void Dispose() 
    { 
    /* release gate */ 
    } 
} 

これを有することにより、私はそうのようなlibary powerthreading 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

必ずしもそうではありません。 Jeffrey RichterのReaderWriterGateをご覧ください。 –

+0

node.js ;-) – ianj

答えて

2

マイパワースレッディングライブラリには、AsyncEnumeratorと統合されたSyncGateクラスがあります。私はあなたが望むAPIを提供していると思います。

+0

私はそれを逃したに違いありません。そのクラスを見たことはありません。これは私が探してきたものなので、あなたのパワースレッディングライブラリのサンプルにそれを含めてください。ありがとう、リヒター氏。 –

関連する問題