6. ということでasync/await
• 非同期処理を同期っぽく書ける
• ちゃんとコールバック呼び出しに変換される
• スレッドをブロックしない
var c = new HttpClient();
var res = await c.GetAsync("http://ufcpp.net");
var content = await res.Content.ReadAsStringAsync();
例
awaitって書くだけで
非同期処理を
同期っぽく待てる
この間、UIスレッドを止めない
ゲームがフリーズしない
• ゲームではフリーズしないの大事
• スマホゲーなんて通信だらけ
• await大事
7. Taskクラス
• async/awaitのお供にTaskクラス
• (System.ThreadingTasks名前空間)
• ちなみに
• 所定のパターンを満たせばTask以外でもawait可能
• でも、たいていの場面ではTaskでOK
var c = new HttpClient();
var res = await c.GetAsync("http://ufcpp.net");
var content = await res.Content.ReadAsStringAsync();
Task<HttpResponseMessage> GetAsync(string requestUri);
8. Taskとコルーチン
• Q. コルーチンではダメ?
• UnityEngine.dllの参照要らない(Unityの外とのコード共有)
• 非同期I/O向けにはTaskの方が効率いい
• コルーチンは本来「毎フレーム1回Updateが呼ばれるような処理」向け
• 戻り値の受け渡しがだいぶ楽
var c = new HttpClient();
var res = await c.GetAsync("http://ufcpp.net");
var content = await res.Content.ReadAsStringAsync();
戻り値!
さっきの例
9. TaskとJob System
• Unity、今度Job Systemとかいうの入れるって言ってるけど?
• (自称)速いらしいけど…
• 用途が絞られてる上に、結構特殊処理っぽい
• Parallel†代わりにはなってもTask代わりにはならない
並 列 計 算 非 同 期 I / O
† System.Threading.Tasks名前空間の静的クラス。
並列Forとか並列ForEachメソッドを持ってる
18. C# 7.0: パターン(型スイッチ)
var d = obj as IDisposable;
if (d != null)
{
d.Dispose();
}
if (obj is IDisposable d)
{
d.Dispose();
}
変更前
変更後
• as + nullチェックを
is 1個で書ける
19. おまけ: コンストラクター生成
class Point
{
public int X { get; }
public int Y { get; }
}
class Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
変更前
変更後
• プロパティからコンストラクター
を作れる
• 逆も可(コンストラクター引数か
らプロパティ)