0

長時間実行されるタスクの実行中に応答性を維持する UI の設計に頭を悩ませようとしています。

そのために、VS2012 で簡単なアプリを作成し、次のクラスを追加しました。

using System.Threading.Tasks;

namespace TaskTest
{
    class Class1
    {
        public async Task<int> Async()
        {
            //simulate a long running process
            for (long x = 0; x < long.MaxValue; x++) { }
            return 1;
        }
    }
}

次に、メイン ページの LoadState() メソッドを次のように変更しました。

protected override async void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
    await DoLongRunningProcess();
}

private async Task DoLongRunningProcess()
{
    var id = 0;
    id = await new Class1().Async();
    await new MessageDialog(id + "").ShowAsync();
}

そのプロセスの実行中にページの応答性を維持したい。ただし、このコードを実行すると、ページの読み込みに時間がかかります。私は何を間違っていますか?

ティア

4

2 に答える 2

3

async魔法ではありません。それはあなたに非同期コードを書く能力を与えるだけです。特に、バックグラウンドスレッドでコードを実行async しませ。これを行うために使用できますTask.Run

my async/ awaitintroまたはMSDNドキュメントが役立つ場合があります。

于 2012-12-06T23:17:20.247 に答える
0

それは役に立ちました。次の変更を加えたところ、探していた結果が得られました。

class Class1
{
    public int Launch()
    {
        //throw new Exception("Class1 exception");
        for (var i = 0; i < int.MaxValue / 2; i++) ;
        return 1;
    }
}

...

protected async override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
    var task = DoLongRunningProcess();
    await task;
    await new MessageDialog(task.Result + "").ShowAsync();
}

private Task<int> DoLongRunningProcess()
{
    return Task.Run<int>(() => new Class1().Launch());
}

ページは引き続きロードされ、短い一時停止の後、メッセージ ダイアログが表示されます。ただし、例外をキャッチする方法を知る必要があります。//throw new Exception ... Launch() メソッドの行のコメントを外すと、未処理の例外として報告されます。メイン UI スレッド (つまり、メソッド LoadState の本体) でこの例外をキャッチしたいのですが、それを管理できないようです。

于 2012-12-08T02:23:40.800 に答える