73042


ユーザーコントロールのコンストラクタをasyncのメソッドにすることができないので、`OnInitialized`をオーバーライドしてそれをasyncにし、その中で非同期処理をawaitで待ってみましたがデッドロックしました。  
コンストラクタで待つと当然のようにデッドロックしました。

[code]

        public partial class AccountCreator : UserControl
        {
            AccountCreatorViewModel _vm = new AccountCreatorViewModel();
    
            public AccountCreator()
            {
                InitializeComponent();
                _vm.ReadAsync().ConfigureAwait(false).GetAwaiter().GetResult();
            }
        }
    
[/code]

`ConfigureAwait(false)`によってUIスレッドに戻さないようにしてもだめなようです。

ユーザーによるボタン操作等ではなく、コントロールやウィンドウの初期化時に非同期処理をデッドロックさせずに待つ方法はありますか？

追記：  
この質問に至った背景  
アプリケーションを起動した際に、GoogleスプレッドシートAPIを使用してスプレッドシートの内容を読み込みます。
ネットワークの通信を行うため、その処理は非同期にしてあります。
通信にそこまでの時間はかかりませんが、ユーザーがボタン等を操作しなくても通信処理は走っていてほしいため、このような質問をしました。


CC BY-SA 4.0
2021-01-03T05:48:20.063
73039
2021-01-03T06:31:39.140
2021-01-03T06:12:32.473
32911
32911
question
c# wpf 非同期
wpfでウィンドウロード時などに自動で非同期処理を待つ方法


呼び出し側で ConfigureAwait(false) を付与しても意味が無いのでは？

ReadAsync() の中はどうなっているのでしょう？ たぶんその中で await を使っているのではないかと思いますが、であれば、そこで
ConfigureAwait(false) を使うべきと思います。以下のようにできるのであればそれで試してみたはいかがですか？

[![画像の説明をここに入力](https://i.stack.imgur.com/MbUmN.jpg)](https://i.stack.imgur.com/MbUmN.jpg)

ちなみに、上の画像の TimeCosumingMethod メソッドのコメントアウトした方のコードではデッドロックになります。


CC BY-SA 4.0
2021-01-03T06:31:39.140
73042
2021-01-03T06:31:39.140
43387
73039
answer