Open棟梁Project - マイクロソフト系技術情報 Wiki * 目次 [#l24f314e] #contents *概要 [#d9ab14bf] -スレッド~ スレッドの並列実行はOSが裏で無意識にしてくれていた。 --タイムスライスで細切れ/ラウンドロビンで論理的に並列実行。 --CPUのコア数に応じて、物理的に並列実行。 -タスク~ awaitを切れ目として、プログラマが意識してプログラムを区切る。 --昔懐かしい、[[ノンプリエンプティブ・マルチタスク]](Win3.1)~ なので、スレッドのタイムスライスのような細切れにはならない。 *スレッド同期 [#w87411f4] タスクなので、一連の処理が、同じスレッドで実行される保証は無く、~ スレッド同期のlock等は無意味。そもそも使用不可能。 -lock/mutex/semaphoreはtaskで全て使用禁止 --旧プログラムでmutex使ってる場合に、awaitで追加開発したいときは、SemaphoreSlimに修正が必要 --.NET TIPS:非同期:awaitを含むコードをロックするには?(SemaphoreSlim編)[C#、VB] - @IT~ http://www.atmarkit.co.jp/ait/spv/1411/11/news117.html ---SemaphoreSlim.WaitAsync関数もasync/awaitする。 ---つまり、Semaphoreによるlockさえ、タスクとして分割されて待機/実行される。 -WIN32系同期APIのうち、待機関数のWaitFor[Single|Multi]Objectは例外的に使用可能。 --ThreadPool.RegisterWaitForSingleObject メソッド (System.Threading)~ https://msdn.microsoft.com/ja-jp/library/system.threading.threadpool.registerwaitforsingleobject *サマリ [#nf166e6d] -async/awaitの登場で、同期型処理と、ほぼ変わらない記述が可能になった。 -しかし、デバッグの時は非同期で実行されていることを意識する必要がある。 *参考 [#l0e9a88c] -Tasks are (still) not threads and async is not parallel~ http://blogs.msdn.com/b/benwilli/archive/2015/09/10/tasks-are-still-not-threads-and-async-is-not-parallel.aspx -c# - Wrapping ManualResetEvent as awaitable task - Stack Overflow~ http://stackoverflow.com/questions/18756354/wrapping-manualresetevent-as-awaitable-task