2016年9月13日火曜日

Task async/awaitの挙動チェック AsyncInfo編

Task async/awaitの挙動チェック AsyncInfo編

前回はTaskについて調べた。
今回はUWPアプリで出てくるAsyncInfoについて挙動をチェックする事にした。

前回のTaskをラップしてキャンセルと通知機能を付加する機能なのだが、
スレッドIDはどう割り当てられるのか分からない状態である。
焦点は内包するTask自身がTask.Runするしないの動作、AsTaskした時の動作のチェックである。
AsyncInfoの外側は前回の結果からすると同期処理になっている事からTask.Runしないが正解。
だけどAsyncInfo自身で非同期しているのではないかという疑問があるので調査する事にした。


結果:
 3
 test1=3
 ---
 test2=7
 ---
 test4=7
 ---

・AyncInfo内部で非同期するような処理になっていない(test1)
・AsyncInfoに内包するActionをTask.RunにするとスレッドIDが変わる(test2)
・AsTask().Wait()するとフリーズする(test3)
・AsTask()でスレッドIDが変わらない(test4)

まとめると
・Taskと同じ性質である。
・AsyncInfo内に内包するActionはTask.Runしないこと。



ーーー以下ソースコードーーー


private async void rb2_Click(object sender, RoutedEventArgs e)
{
    Debug.WriteLine(Environment.CurrentManagedThreadId);
    await AsyncInfo.Run(async (token) =>
    {
        await Task.Delay(1);
        Debug.WriteLine($"test1={Environment.CurrentManagedThreadId}");
    });
    Debug.WriteLine("---");
    await AsyncInfo.Run((token) => Task.Run(()=>
    {
        Debug.WriteLine($"test2={Environment.CurrentManagedThreadId}");
    }));
    //freeze
    //Debug.WriteLine("---");
    //AsyncInfo.Run(async (token) =>
    //{
    //    await Task.Delay(1);
    //    Debug.WriteLine($"test3={Environment.CurrentManagedThreadId}");
    //}).AsTask().Wait();
    Debug.WriteLine("---");
    await AsyncInfo.Run(async (token) =>
    {
        await Task.Delay(1);
        Debug.WriteLine($"test3={Environment.CurrentManagedThreadId}");
    }).AsTask();
    Debug.WriteLine("---");
    AsyncInfo.Run((token) => Task.Run(() =>
    {
        Debug.WriteLine($"test4={Environment.CurrentManagedThreadId}");
    })).AsTask().Wait();
    Debug.WriteLine("---");
}



コメントを投稿

Androider