[C#] Threadはもう古い?(Task編)

Speech関係でThreadを使っていたが、ある時「Threadはもう古い。コスト高いしやめときな」という記事を見る。
ちょうど謎のOut of Memory問題でThreadを疑っていたので「そんじゃどうすんの?」となった。
で、ふたつの方法があったのだけど。

1. awaitとかasyncとか使う方法

 よさげなんだけど、VS 2010 Express系ではどうも動かないっぽい。

2. Taskを使う

 こっちは2010でも動くっぽいな。

とあるところで、情報共有上の都合から「2010でやってください」っていうとこがあって、そこでは2013が使えないし開発環境もWindows7だ。したがって、まずTask編からやってみた。

[Task編]

                    try
                    {
                        var task = Task.Factory.StartNew(() => {
                            running = true;
                            if (s.Count > 0)
                            {
                                string x = s[0];
                                s.RemoveAt(0);
                                try
                                {
                                    h.Speak(x);
                                }
                                catch (Exception ee)
                                {
                                    lasterror = ee.Message;
                                }
                            }
                            running = false;
                        });
                        task.Wait(); // ここで終了まで待とうじゃないか。
                    }
                    catch (Exception e3)
                    {
                        lasterror = e3.Message;
                    }

「[C#] Threadはもう古い?(Task編)」への2件のフィードバック

  1. カテゴリはC#なんだけど、全くパラダイムが異なる処理の軽量化について:

    実は2015年夏のコミックマーケットで、私は初めてHaskellに関する本を入手した。
    それ自体は(言語の書式が異質すぎた事もあって)マスターに繋がらなかったのだが、関数型言語の基本的な道具立てを理解する役には立った。

    2016年に入って、Python3に基本的な関数型言語の実装が移植されていた事を知った。

    Pythonは、書式的にはシンプルで扱いやすい({}を使わず改行とインデントを代わりにするために、人の目には見づらい部分があるが、機械にとっては同じ意味を持つ構文が使える)。

    関数型言語の道具立てを使うと、コードの絶対量は若干減る程度だが、実際に行われる処理を効率化出来る(数学的にそうなるように仕組まれている)。

    いわく関数のカリー化や、これまでも引数渡しで多用していたような処理を関数そのものを渡して行える事、ラムダ式や高階関数のようなテンプレート的なものの大規模な導入、加えてyield文のような「あっさり再帰呼び出しループを定義できる」部分関数の書き方など。

    C#が使える処理系なら、F#(Microsoftが開発した関数型言語)も使えるので、新しい道具立てを試してみるのも面白いかも。

  2. うお、Haskellですか!
    基本的に関数型ってやつが苦手で、定期的に勉強を繰り返して要素だけでもとれないかと足掻いている僕には、すごいという以上の感想がないです。

    でも関数型を定期的に学ぶのはやめないのですが。
    なぜって?
    たとえその処理系をうまくマスターできなかったとしても、新しいことが学べたことは多いし、それが役立ったこともあるから。
    ひとつの何かを突き詰めるのも大切だけど。
    引出しを増やすのも重要。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)