私は古いファイアアンドフォーゲット呼び出しを新しい構文に置き換えようとしています。もっと単純になることを望んでいますが、それは私にはわかりにくいようです。これが例です
class Program
{
static void DoIt(string entry)
{
Console.WriteLine("Message: " + entry);
}
static async void DoIt2(string entry)
{
await Task.Yield();
Console.WriteLine("Message2: " + entry);
}
static void Main(string[] args)
{
// old way
Action<string> async = DoIt;
async.BeginInvoke("Test", ar => { async.EndInvoke(ar); ar.AsyncWaitHandle.Close(); }, null);
Console.WriteLine("old-way main thread invoker finished");
// new way
DoIt2("Test2");
Console.WriteLine("new-way main thread invoker finished");
Console.ReadLine();
}
}
どちらのアプローチも同じことをしますが、私が得たように見えるもの(EndInvoke
ハンドルを閉じる必要はありません、それはまだ少し議論の余地があります)私は待つ必要があることによって新しい方法で失っていますTask.Yield()
、それは実際に新しい問題を引き起こしますそのワンライナーを追加するためだけに、既存のすべての非同期F&Fメソッドを書き直す必要があります。パフォーマンス/クリーンアップに関して目に見えない利点はありますか?
バックグラウンドメソッドを変更できない場合、どうすれば非同期を適用できますか?直接的な方法はないようです。Task.Run()を待つラッパー非同期メソッドを作成する必要がありますか?
編集:私は今、私が本当の質問を逃しているかもしれないのを見ます。問題は次のとおりです。同期メソッドA()が与えられた場合、「古い方法」よりも複雑なソリューションを取得せずに、ファイアアンドフォーゲット方式で async
/を使用して非同期的に呼び出すにはどうすればよいですか。await