手っ取り早い方法はTaskクラスを使う。

        public Task<int> TestAsync()
        {
            return Task.Run<int>(async () =>
            {
                // ↓このループは時間のかかる処理のつもり
                for (int i = 0; i < 10; i++)
                {
                    Debug.WriteLine(i);
                    await Task.Delay(1000);
                }
                return 123;
            });
        }

        private async void button_Click(object sender, RoutedEventArgs e)
        {
            int ret = await TestAsync();

            await new MessageDialog(ret.ToString()).ShowAsync();
        }

詳しくは、

連載:C# 5.0&VB 11.0新機能「async/await非同期メソッド」入門(最終回):第3回 非同期メソッドの内部実装とAwaitableパターンの独自実装 (2/2) - @IT

に書かれている。

実際のところは、時間のかかる処理は別スレッドで動かすと思うんでTask.Runを使う方法でいいと思う。