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();
}
}
}