14

WPF 4.5アプリケーションで、待機+タスクを使用したときにUIがブロックされる理由がわかりません。

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        // Task.Delay works great
        //await Task.Delay(5000);

        double value = await JobAsync(25.0);

        MessageBox.Show("finished : " + value.ToString());
    }

    private async Task<double> JobAsync(double value)
    {
        for (int i = 0; i < 30000000; i++)
            value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75)));

        return value;
    }

await Task.Delayはうまく機能しますが、awaitJobAsyncはUIをブロックします。なんで ?ありがとうございました。

4

2 に答える 2

26

警告が表示されるはずですJobAsync-式が含まれていませんawaitすべての作業はまだUIスレッドで行われています。この方法については、実際には非同期的なものは何もありません。

メソッドにマークasyncを付けても、別のスレッドで実行されることはありません。非同期操作を結合し、適切なコンテキストに戻ることが容易になるということです。

一歩下がって、MSDNの非同期に関するいくつかの資料を吸収するのは良い考えだと思います...これは良い出発点です...

于 2012-10-08T17:46:40.250 に答える
10

これを試して:

private Task<double> JobAsync(double value)
{
    return Task.Factory.StartNew(() =>
    {
        for (int i = 0; i < 30000000; i++)
            value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75)));

        return value;
    });
}
于 2012-10-08T17:45:09.987 に答える