FeliCaを非同期で読み込む(C# 5.0のasync,awaitを使用)

EdelSoft FeliCa Port Access Libraryを使用します(https://sites.google.com/site/felicalib/home)

asyncとawaitを使うと、わりと簡単に非同期の処理がかけます。
同期型だとFelica読み取りが終わるまでかたまったようになりますが、非同期だと他の操作もスムーズにできます。

Felicaを読み取った後で値を返さないといけないので、以下のようなClassをつくっておきます。

public class FelicaCard {
public string IDm { get; set; }
public string PMm { get; set; }
}

次に同じClass内に非同期Methodをつくります。(EdelSoft.FeliCa.dllの参照が必要)
for文のなかでループかけているので、同期型で実行した場合、画面がかたまったようになってしまいます。
FuncをつくってTask.Runするときにawaitをつけて実行します。

///


/// Felicaカード非同期連続読み取り(0.5秒間隔) minuteは読み取り秒数
///

///
async public static Task ReadAsync(int minute=10) {
Func newFunc = () => {
var card0= new FelicaCard();
using (Port port = new Port()) {
for (int i = 0; i < minute*2; i++) {
Card card = port.Polling();
if (card.IDm.Equals("00:00:00:00:00:00:00:00")) {
System.Threading.Thread.Sleep(500);
continue;
}
card0 = new FelicaCard { IDm = card.IDm, PMm = card.PMm };
break;
}
}
return card0;
};
// 非同期で実行する
var cardRet = await Task.Run(newFunc);
return cardRet;
}

そしてこれを呼び出す側は、

var card = await FelicaCard.ReadAsync(20);

これだけで、ちゃんと非同期で実行されます!