TechFULの中の人

triple-four’s blog

やさC#で簡単な非同期処理2 ~Wait()~

こんにちは!魚介類のサバです。 最近、といっても数か月前ですが、C#の非同期処理が必要になって触った機会があったので、忘れないうちに出力したいと思います!

今回は 「Wait()」 を理解することが目的です。
親切な解説ができるように努力します!!

※魚介類なので、浅い知識で書いています。ふわふわした解説や、ちょっとした間違いはご了承ください。

Wait() する

Task.Run の戻り値は Task<> 型です。Task<>型 は Wait() メソッドを持ち、これを使うと、呼び出した別スレッドの処理が終わるまで、呼び出し元のスレッドをハードウェイトさせます。

static void Main(string[] args)
{

    Console.WriteLine("Hi : Main    Thread");

    Task.Run(() =>
    {
        for(int i{}; i < 100; ++i)
            Console.WriteLine("Hi : Another Thread " + i);
    }).Wait();   // 呼び出したスレッドの処理が終わるのをハードウェイト

}
  • ここでは別スレッドに重い処理(forループ100回)をさせ、それが終わるのをメインスレッドがハードウェイトで待っています。

ハードウェイト?

Wait() の中身はこんなイメージです。そのため、別スレッドの処理が終わるまで、呼び出し元のスレッドは全く無意味な処理(ループ文ぐるぐる)を行い続けます。

while( 呼び出した別スレッドが処理を続けているなら ){
}
  • ここで重要なのは、呼び出し元スレッドが、別スレッドの処理が終わるのを全力で待ち続け、それ以外何もできなくなる点です。 スレッドがブロックされた状態などともいい、実質的に呼び出し元スレッドは停止します。

Result に注意

Task.Run() に渡したラムダ式の戻り値を取得するために、Task型の Result プロパティを使用する方法があります。(この前回の記事にサンプルコードもあります。)

triple-four.hatenablog.com

Result は内部で Wait() を呼び出し、ラムダ式の戻り値が決定するまで呼び出し元スレッドをハードウェイトさせてしまいます。そのため、Task.Run() した後、すぐに Result でラムダ式の戻り値を取得しては、非同期処理をする意味が全くなくなります。

Wait() のためだけにこの記事を書くのは手抜きなのでは?

Wait() の理解が重要だと考え記事を分けました。特に、どういう仕組みで別スレッドを待っているか、その間Wait()しているスレッドはなぜ何もできないのかを理解してほしいです!

非同期処理に目覚めたあなたに素敵なプレゼント!

実行スレッドを特定する方法

System.Threading名前空間ThreadクラスのプロパティCurrentThreadのプロパティManagedThreadIdを使うことで、そこを処理しているスレッドのIDを取得することができます。実験の際にとても役に立ちます。

using System.Threading.Tasks;
using System.Threading;

static void Main(string[] args)
{

    Console.WriteLine("Main    Thread ID : " + Thread.CurrentThread.ManagedThreadId);

    Task.Run(() =>
    {
        Console.WriteLine("Another Thread ID : " + Thread.CurrentThread.ManagedThreadId);
    }).Wait();

}
  • 非同期できるならいろいろ試してみたいですよね!そんなあなたにはこちら!これだけで実行スレッドを特定できる ID を取得できます!
  • 実際に非同期になっているのか、どの部分がどのスレッドで処理されているのかはっきりわかります!!

最後に

前回の記事で、「Wait() ってなんだよ!?」と思った方、そうでない方、いずれの方々にも誤解なく理解してもらいたくこの記事を書きました。 次回は非同期処理とメソッドについて書きたいと考えています!

運営会社 / サービス

444株式会社

triple-four.com

TechFUL

procon.techful.jp

再帰関数を分かりやすく解説してみる【入門】

こんにちは!ganariyaです。
最近ほとんど遊んでないので、遊びたいですが遊ぶ相手がいません・・・(かなしい)

さて!(切り替え!)
プログラミング始めたてあるあるなのですが、再帰関数、みなさんどのような印象でしょうか・・・
再帰関数は、プログラミングを始めた頃の最初の関門であり、なかなかイメージし辛く、書きづらい、何をしているのかがよく分からない内容です。

しかし、再帰関数は最初理解するのが難しいですが、一度理解してしまえば応用しやすい概念・テクニックであり、色々なことに応用できます。

今日は、その再帰関数の考え方やどのようなお気持ちで書くのかについて、(出来るだけ)分かりやすく書いてみようと思います。


続きを読む

やさC#で簡単な非同期処理1 ~Task.Run()~

こんにちは!魚介類のサバです。 最近、といっても数か月前ですが、C#の非同期処理が必要になって触った機会があったので、忘れないうちに出力したいと思います!

今回は 「別スレッドで処理を実行する」 ことのみが目的です。つまり並列処理です。
親切な解説ができるように努力します!!

※魚介類なので、浅い知識で書いています。ふわふわした解説や、ちょっとした間違いはご了承ください。

続きを読む

第9回 TechFUL全国ハッカソン結果発表

こんにちは。

TechFULの中の人のSRです。

第9回  TechFUL全国ハッカソンが終了いしました。今回は動的計画法というアルゴリズムにちなんだ問題が3問出題されました。結果発表と豪華賞品の新春お正月ハッカソンの告知です。

 

続きを読む