« [WinRT]LastModifiedをとる。 | トップページ | [WinRT]続・非同期と排他 »

2013.07.09

[WinRT]非同期と排他

よくわからない......async/awaitでなんとなく排他制御はうまくいくようになっている。

async Task Func1Async() {
    Func2();
    await Func3Async();
    Func4();
}

とあったとき、ちゃんとFunc1Async()->Func2()->Func3Async()->Func4()の順番で同じスレッドで呼ばれる。
でも、Func4()は、Func3Async()の後処理として呼ばれる。 これは、Func1Async()の呼び出し側でもawaitしないとダメであることを意味する。

GoodFunction()
{
    await Func1Async();
    Func1After();
}
BadFunction()
{
    Func1Async();
    Func1After();
}

このBadFunction()の例では、Func1Async()->Func2()->Func3Async()で別スレッド処理を呼び出して、その後Func1After()が呼ばれる。その後Func3After()のスレッドが終了後後処理としてFunc4()が呼ばれる。
awaitを使うと関数内の非同期呼び出しをしらっと同期関数っぽく書くことはできるけど、その書いた関数が同期関数になるわけではない。
理解してみると、当然だけど、最初はいまいち納得しなかった.......

さて、そのようにして調子づいて書いていたんだけど、やっぱり排他が必要な目にあった......

ReadDataAsync()
{
   if(completed)  return;①
   using(TextReader reader = await GetReaderAsync()){②
      doSomething();③
      complted = true;④
   }
}

この③・④の処理は、②の後処理スレッドとして実行される。別の呼び出しの、①の判定処理のが先に行われる場合がある。とりあえず、今回は、③の前に、判定をもう一個入れたんだけど、おおむね大丈夫だけど、やっぱり駄目かもしれない。さらに、ReadAsync()とか使うと、まるでうまくいかない.......どうすればいいんだろう.......lock使うと怒られるし......AsyncLockなるソースが落ちていたのでそれを使うのがいいのかな。でも、標準でもっとうまくできるよね......そういうもんなのかな........とはまり中。

そもそも、こんな事態になっていることが間違い???

|

« [WinRT]LastModifiedをとる。 | トップページ | [WinRT]続・非同期と排他 »

コメント

コメントを書く



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




トラックバック

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

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

« [WinRT]LastModifiedをとる。 | トップページ | [WinRT]続・非同期と排他 »