async/await

async/awaitについて、理解するために書いてみた。

まだまだ、関連するメソッドや細かい仕様部分は調べつつ扱っていかなければ...
「非同期処理って何だろう?」の事始めにして、感覚を掴む記事になれば幸い

Point

  • async/awaitC# 5.0から導入されたTaskと紐づく構文
  • Taskは単なる手順書!
    asyncは単なる非同期メソッド!awaitはタスクの完了を待ち、取り出す!

これを抑えておけば、あとは下記のコードを見てもらえるとすぐ分かると思う。

f:id:danker512:20170604184732p:plain

asyncTask.Wait(); の部分とかコメントアウトするともっと体感できると思う
※メイン処理が早く終わってしまうので、待ち時間は10秒に変更

f:id:danker512:20170604190213p:plain

参考:
C# Task async, await の使い方 - mcommit's message
Taskを極めろ!async/await完全攻略 - Qiita

NOT EXISTSで差分抽出

サブクエリーが少なくとも1行を返す場合、EXISTS subquery は TRUE、NOT EXISTS subquery は FALSE。 下記の例は、aとbのテーブルの列名Aと列名Bを比較し一致しないものを返す。

例:

select * from テーブル名A as a
where not exists (
    select * from テーブル名B as b
    where a.列名A = b.列名B  // 条件
)
and a.列名A' = xxx

開発DBに不正な値があり、それがどの子か特定した経緯。

EnumのTryParse

第1引数には変換する文字列を指定する。 第2引数には変換された値を受け取る型の変数を指定する。

Enum.Parse とは異なり、例外をスローすることなく、変換できる。

Foo foo;
if (!Enum.TryParse(bar.ToString(), out foo))
{
    throw new InvalidCastException($"Fooには定義されていない値が選択されてます");
}

参考:Enum.TryParse(TEnum) メソッド (String, TEnum) (System)

値型と参照型

値型/参照型、構造体/クラス備忘録

値型はオブジェクト内にインライン定義され、 参照型は、実データをヒープに格納する。

その型をどのように扱うかを考え、 多様性(ポリモーフィズム)を持つか否かを考える必要がある。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            // 値型
            var valueType = new ValueType
            {
                value = 1
            };
            
            // 参照型
            var classType = new ClassType
            {
                value = 1
            };

            Plus(valueType, classType);

            Assert.AreEqual(1, valueType.value);
            Assert.AreEqual(2, classType.value);
        }

        static void Plus(ValueType valueType, ClassType classType)
        {
            valueType.value += 1;
            classType.value += 1;
        }

        struct ValueType { public int value; }
        class ClassType { public int value; }
    }
}