« [WinRT]非同期と排他 | トップページ | [WinRT]ListViewの先頭位置 »

2013.07.10

[WinRT]続・非同期と排他

ちょこちょことasync/await周りを眺めてみた。やはりロックは別途必要な模様。

ロックがないままのasync/awaitって利用価値ってどのくらい?
そもそも、async/awaitはどうだろう。ちょこちょこっとしたのが非同期になっちゃっているんでやむなくのものかなという気もしつつ。便利は便利かも。
でも、WinRTからC#に入ってくると、ロックの使い方がよくわからない。
・lockステートメント:簡単だけど、awaitが中では使えない。
・Monitor.Enter/Exit:lockステートメントの実体。
書くことはできるけど使えない。
Monitor.Enter(object);
Debug.WriteLine("ENTER");
doSomething();
Debug.WriteLine("EXIT");
Monitor.Exit(object);

としても、ガンガンENTERが被る。たぶん、全部UIスレッド呼び出しだから、再入可能で入ってくるのかなと。

・Mutex・Semaphore・SemaphoreSlim:どれでも使えそう。でも、C#なら、SemaphoreSlimがいいっぽい。
MSDN:Semaphore と SemaphoreSlim参照。 あと、usingを使うと、勝手に解放されてくれるらしいので、その仕組みを使って、ざっくりでっち上げた。

public class AsyncLock
{
    private SemaphoreSlim _semaphore;
    public AsyncLock()
    {
        _semaphore = new SemaphoreSlim(1);
    }
    public AsyncLock(int initialCount)
    {
        _semaphore = new SemaphoreSlim(initialCount);
    }
    public AsyncLock(int initialCount, int maxCount)
    {
        _semaphore = new SemaphoreSlim(initialCount, maxCount);
    }
    public class Locker : IDisposable
    {
        private SemaphoreSlim _semaphore;
        internal Locker(SemaphoreSlim semaphore)
        {
            this._semaphore = semaphore;
        }
        public void Dispose()
        {
            _semaphore.Release();
        }
    }
    public async Task

LockAsync()     {         await _semaphore.WaitAsync();         return new Locker(_semaphore);     } }

無名クラスも作れない模様なので、usingのために、IDisaposableを返すようにして、派生クラスをLockerとして公開したけど、名前は適当。Lockにしてみたけど、Lock lockってのは書けないので、まあいいやと。

AsyncLock lock = new AsyncLock();
async void Foo()
{
    using(AsyncLock.Locker locker = await asyncLock.LockAsync()){
        doSomething();
    }
}

という感じで使う。AsyncLock.Lockerにしているけど、当然IDisposableでも大丈夫。なんとなく雰囲気で。でも、Async並びすぎ。 さて、IDisposableから、delegateを受け付けるようにして、それをラムダ式で渡せるクラスがあれば、いいけど、探すのが面倒なので、この辺にて。

|

« [WinRT]非同期と排他 | トップページ | [WinRT]ListViewの先頭位置 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/3881/57759851

この記事へのトラックバック一覧です: [WinRT]続・非同期と排他:

« [WinRT]非同期と排他 | トップページ | [WinRT]ListViewの先頭位置 »