[解決済み] コンストラクタは非同期にできますか?
質問
あるプロジェクトで、コンストラクタにデータを入力しようとしています。
public class ViewModel
{
public ObservableCollection<TData> Data { get; set; }
async public ViewModel()
{
Data = await GetDataTask();
}
public Task<ObservableCollection<TData>> GetDataTask()
{
Task<ObservableCollection<TData>> task;
//Create a task which represents getting the data
return task;
}
}
残念ながら、エラーが発生しました。
モディファイアの
async
はこのアイテムには有効ではありません
もちろん、標準的なメソッドでラップして、それをコンストラクタから呼び出すと。
public async void Foo()
{
Data = await GetDataTask();
}
は正常に動作します。同様に、古いインサイドアウトの方法を使用する場合
GetData().ContinueWith(t => Data = t.Result);
それも有効ですね。ただ、どうして
await
をコンストラクタ内から直接呼び出すことができます。おそらく、たくさんの(明白な)エッジケースや反対の理由があるのでしょうが、私には思いつきません。また、説明を求めていろいろと検索してみましたが、見つからないようです。
解決方法は?
コンストラクタは、構築された型を返すメソッドと非常によく似た動作をします。そして
async
メソッドは任意の型を返すことはできず、"fire and forget "でなければなりません。
void
または
Task
.
型のコンストラクタを使用する場合
T
実際に返された
Task<T>
というのは、非常に分かりにくいと思います。
もし非同期コンストラクタが
async void
メソッドを使用すると、コンストラクタの意味が壊れてしまいます。コンストラクタが戻った後は、完全に初期化されたオブジェクトを取得する必要があります。将来の未定義の時点で実際に適切に初期化されるようなオブジェクトではありません。運良く非同期初期化に失敗しなければの話ですが。
これらはすべて推測に過ぎません。しかし、非同期コンストラクタの可能性を持つことは、その価値よりも多くのトラブルをもたらすように思えます。
の「ファイア・アンド・フォーゲット」セマンティクスが必要な場合。
async void
メソッド (これはできれば避けたいものです) を使用すると、すべてのコードを簡単に
async void
メソッドを作成し、それをコンストラクタから呼び出すことができます。
関連
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 非同期アロー関数のシンタックス
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み] 静的コンストラクタの用途は?
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み】Nullableオブジェクトは値を持たなければならない?