Weather Typing 3 の対戦部分を作っているが,C#のソケットは同期関数と非同期関数がある。通信中にUIをブロックしたくないので,BeginConnect~EndConnectなどの非同期関数を使うのだが,相当めんどう。処理がその場で終わらないので処理の続きは基本コールバック関数になる。するとイメージ的には以下のようなワケの分からない処理になってしまう。実際には再AcceptとかするのでLambda式では書かないけど。
class Server { Callback OnLogin; Callback OnError; void Start() { try { BeginAccept(() => { try { BeginReceive(() => { try { if("login") { OnLogin(); } } catch(Exception) { OnError(); } }); } catch(Exception) { OnError(); } }); } catch(Exception) { OnError(); } } }
Analog Book Readerでも非同期処理で苦しんだけど,WindowsRTの場合はだいたいの関数がawaitできるのでまだよかった。同じ事をするのにこんなにすっきり書ける。
class Server { Callback OnLogin; Callback OnError; async Task Start() { try { await Accept(); await Receive(); if("login") { OnLogin(); } } catch(Exception) { OnError(); } } }