[解決済み] インターフェース実装の非同期化
2022-05-06 18:31:39
質問
私は現在、いくつかの非同期メソッドを使用してアプリケーションを作成しようとしています。 私のすべてのIOは、インターフェイスの明示的な実装を通して行われ、私は操作を非同期にする方法について少し混乱しています。
私の見るところ、実装には2つの選択肢があります。
interface IIO
{
void DoOperation();
}
OPTION1: 暗黙の実装を非同期で行い、その結果を暗黙の実装で待ちます。
class IOImplementation : IIO
{
async void DoOperation()
{
await Task.Factory.StartNew(() =>
{
//WRITING A FILE OR SOME SUCH THINGAMAGIG
});
}
#region IIO Members
void IIO.DoOperation()
{
DoOperation();
}
#endregion
}
OPTION2: 明示的な実装を非同期で行い、暗黙的な実装からタスクを待ち受ける。
class IOAsyncImplementation : IIO
{
private Task DoOperationAsync()
{
return new Task(() =>
{
//DO ALL THE HEAVY LIFTING!!!
});
}
#region IIOAsync Members
async void IIO.DoOperation()
{
await DoOperationAsync();
}
#endregion
}
これらの実装のうち、どちらかが優れているのか、それとも私が考えていない別の方法があるのでしょうか?
どのように解決するのですか?
どちらの選択肢も正しくありません。あなたは同期インターフェースを非同期に実装しようとしています。そんなことはしないでください。問題は
DoOperation()
が返ってきても、まだ操作は完了していません。さらに悪いことに、もし操作の途中で例外が発生したら(IO操作ではよくあることです)、ユーザーはその例外に対処する機会がありません。
そのために必要なのは インターフェイスを変更する のように、非同期で実行されます。
interface IIO
{
Task DoOperationAsync(); // note: no async here
}
class IOImplementation : IIO
{
public async Task DoOperationAsync()
{
// perform the operation here
}
}
こうすることで、ユーザーはその操作が
async
となり、彼らは
await
となります。これはまた、あなたのコードのユーザーをかなり強制的に
async
しかし、それはやむを得ないことです。
また
StartNew()
の実装はあくまで例であり、非同期IOの実装にそれは必要ないはずです。(そして
new Task()
はさらに悪いことに、それは動作さえしません。
Start()
その
Task
.)
関連
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み] 非同期アロー関数のシンタックス
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] async/await - タスクとvoidをいつ返すか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない