atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します。旧ブログ (コンテンツ充実) はこちら -> http://d.hatena.ne.jp/atsukanrock/

Windows 8.1でのasync voidメソッドに対する例外処理の改善

※この記事はException handling improvements for async void methods in Windows 8.1のざっくり和訳です。

ざっくり言うと

async voidなメソッド内で例外が起こると:

  • Windows 8では‥例外は補足不能。アプリは死ぬ
  • Windows 8.1だと‥Application.UnhandledExceptionイベントハンドラーで例外を補足可能。e.Handled = true;でアプリが死なないようにもできる!

というお話。async voidはベストプラクティス的には禁忌なんですけど、Commandとかイベントハンドラーでめっちゃ使うので、ほっこり嬉しい改善です。

補足すると

ただし「Windows 8.1以降のWindowsストアアプリ開発では、未処理例外が全部Application.UnhandledExceptionイベント飛んでくる」わけではないので注意が必要です。例えば次のようなコード(意味ないけど)があったら飛んできません。

private void ButtonOnClick(object sender, RoutedEventArgs e)
{
    Task.Run(() => { throw new InvalidOperationException(); });
}

ちゃんとawaitしてあげましょう。普通にasync/awaitを使って書いてれば飛んできます。

private async void ButtonOnClick(object sender, RoutedEventArgs e)
{
    await Task.Run(() => { throw new InvalidOperationException(); });
}

ConfigureAwait(false)してても飛んできます。

private async void ButtonOnClick(object sender, RoutedEventArgs e)
{
    await Task.Run(() => { throw new InvalidOperationException(); }).ConfigureAwait(false);
}

Windowsストアアプリで同梱のPDFファイルを開く

WindowsストアアプリにPDFファイルを同梱して、それを当該アプリから開くやり方です。気合の入ったREADMEをPDF化してアプリに同梱して、開くボタンを付けるなんて良いですね!それでWindowsストアの審査に通るかどうか知らんけど。

PDFファイルを同梱するには

PDFファイルをプロジェクトに含めて、プロパティのビルド アクションを「コンテンツ」にします。

f:id:atsukanrock:20140130144440p:plain

アプリから開くには

こんな感じのコードで開けます。

private async void ExecuteOpenPdfCommand()
{
    // プロジェクトフォルダー直下の Assets フォルダー内にある Sample.pdf を表示する。
    var uri = new Uri("ms-appx:///Assets/Sample.pdf");
    var file = await StorageFile.GetFileFromApplicationUriAsync(uri);

    // PDF ファイルに関連付けられたアプリが起動して、画面の半分を使って表示される。
    // デスクトップアプリが関連付けられていると…。
    await Launcher.LaunchFileAsync(file, new LauncherOptions
    {
        DesiredRemainingView = ViewSizePreference.UseHalf
    });
}

こんな感じ。*1

f:id:atsukanrock:20140130151408p:plain

ポイントは:

  • URIの指定方法
  • StorageFileの取得方法
  • Launcherクラスを使用すること

応用

ちょっと工夫すれば次のようなことができます:

*1:左側に起動元アプリが表示されています。

勉強会「『プログラミング .NET Framework 第4版 』座談会」で発表しました

はてなダイアリーが許されるのは小学生までだよねー」」「キャハハハハ」という声に押されてはてなブログに移住してみようと思います。せっかくだからMarkdownの練習もしたい。

「『プログラミング .NET Framework 第4版 』座談会」で発表してきました。ということでスライドを公開。内容は、グローバル対応アプリの日時処理で知っておくべきことと注意点をまとめたものです。アウトラインは次の通り: