Skip to content

Instantly share code, notes, and snippets.

@biac
biac / App.xaml.cs
Created December 6, 2011 06:41
BasicToastsSample から抜粋
public partial class App
{
public App()
{
InitializeComponent();
this.Suspending += new SuspendingEventHandler(OnSuspending);
}
async protected void OnSuspending(object sender, SuspendingEventArgs args)
{
@biac
biac / FeedReaderTests.cs
Created December 6, 2011 07:45
FeedReader: ひとつめのテスト
const string RssUrl = "http://www.amazon.co.jp/gp/rss/bestsellers/books/492352/ref=zg_bs_492352_rsslink";
// Amazon.co.jp: 本 > コンピュータ・IT > プログラミングのベストセラー
[TestMethod]
public void ReadAsyncTest1_基本_非同期実行開始後にWait()
{
//* 準備
FeedReader fr = new FeedReader();
Stopwatch sw = Stopwatch.StartNew();
@biac
biac / FeedReader.cs
Created December 6, 2011 08:06
FeedReader: 最初の実装
public async Task<FeedData> ReadAsync(string feedUrlString)
{
Uri feedUri = new Uri(feedUrlString);
return await ReadAsync(feedUri);
}
private async Task<FeedData> ReadAsync(Uri feedUri)
{
SyndicationClient client = new SyndicationClient() { BypassCacheOnRetrieve = true };
SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri); //※
@biac
biac / FeedReader.cs
Created December 6, 2011 08:17
FeedReader: 最初の実装 ~ 同期処理だったらこんな感じ
private /* async Task< */FeedData/* > */ Read/* Async */(Uri feedUri)
{
SyndicationClient client = new SyndicationClient() { BypassCacheOnRetrieve = true };
SyndicationFeed feed = /* await */ client.RetrieveFeed/* Async */(feedUri);
return feed.ToFeedData();
}
@biac
biac / FeedReaderTests.cs
Created December 6, 2011 08:31
FeedReader: ふたつめのテスト ~ Wait() を書かないとどうなる?
[TestMethod]
public void ReadAsyncTest2_補足_Waitは無くてもOK()
{
Stopwatch sw = Stopwatch.StartNew();
Task<FeedData> task = (new FeedReader()).ReadAsync(RssUrl);
sw.Stop();
Assert.IsTrue(200L > sw.ElapsedMilliseconds); //実際には 50mSec 程度
Assert.IsFalse(task.IsCompleted, "ReadAsync 呼び出し直後"); //非同期実行中
@biac
biac / FeedReaderTests.cs
Created December 6, 2011 08:36
FeedReader: みっつめのテスト ~ 同期メソッドみたいに扱える (製品コードではやっちゃダメ)
[TestMethod]
public void ReadAsyncTest3_補足_GetResultで同期メソッドとして扱う()
{
Stopwatch sw = Stopwatch.StartNew();
//FeedData fd = (new FeedReader()).ReadAsync(RssUrl).Result; // こうすれば同期メソッドと同じように使える
FeedData fd = (new FeedReader()).ReadAsync(RssUrl).GetAwaiter().GetResult(); // さらにこうすれば非同期実行側の例外もそのまま出てくる
sw.Stop();
Assert.IsTrue(100L < sw.ElapsedMilliseconds); //実際には 500~1000mSec 程度掛かっている
@biac
biac / FeedReaderTests.cs
Created December 6, 2011 08:43
FeedReader: 4つめのテスト ~ テストケースでは async / await は使えない
[TestMethod]
public async void ReadAsyncTest4_補足_テストケースはasyncに出来ない()
{
FeedData fd = await (new FeedReader()).ReadAsync(RssUrl);
Assert.Fail("テストランナーに制御が戻ってから非同期実行が完了するので、この Fail() はテストランナーで捕捉できない。");
}
@biac
biac / FeedData.cs
Created December 6, 2011 08:52
FeedReader: ToFeedData() 拡張メソッド
public static class SyndicationFeedExtensions
{
public static FeedData ToFeedData(this SyndicationFeed feed)
{
FeedData feedData = new FeedData(){
Title = feed.Title.Text,
};
foreach (SyndicationItem item in feed.Items) {
feedData.Items.Add(CreateFeedItem(item));
}
@biac
biac / FeedReaderTests.cs
Created December 6, 2011 09:04
FeedReader: 並列実行のテスト
private readonly string[] RssUrls = {
// Amazon.co.jp: 本 > コンピュータ・IT > プログラミングのベストセラー
"http://www.amazon.co.jp/gp/rss/bestsellers/books/492352/ref=zg_bs_492352_rsslink",
// Amazon.co.jp: パソコン・周辺機器 > ノートパソコンで一番ギフトとして贈られている商品
"http://www.amazon.co.jp/gp/rss/most-gifted/computers/2151981051/ref=zg_mg_2151981051_rsslink",
// Amazon.co.jp: ソフトウェアで一番ほしい物リストに追加されている商品
"http://www.amazon.co.jp/gp/rss/most-wished-for/software/ref=zg_mw_software_rsslink",
// Amazon.co.jp: DVD > アニメの新着ニューリリース
"http://www.amazon.co.jp/gp/rss/new-releases/dvd/562020/ref=zg_bsnr_562020_rsslink",
// Amazon.co.jp: MP3ダウンロード > MP3 楽曲のヒット商品
@biac
biac / FeedReader.cs
Created December 6, 2011 09:08
FeedReader: 並列処理の実装に挑戦(失敗!)
public async Task<IList<FeedData>> ReadAsync(string[] feedUrlStrings) {
List<FeedData> result = new List<FeedData>(feedUrlStrings.Length);
foreach (string url in feedUrlStrings) {
result.Add(await this.ReadAsync(url));
}
return result;
}