Begin/End メソッドを記述する必要なく非同期メソッドを使用できるバージョン 4.5 の async CTP を試しています。
私の最初のプローブは、void を返す非同期メソッドを実行することです。いくつかの例を見て、次のことを行います。
private void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("click button: " + System.DateTime.Now);
method01Async();
UpdateTxtLog("after ethod01Async: " + System.DateTime.Now);
}
private async void method01Async()
{
await TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("exit method01Async: " + System.DateTime.Now);
});
}
私の WPF プロジェクトには、結果を表示する textBox と、非同期メソッドを実行するボタンがあります。
async メソッドでは、メソッドが async であるため必要な await を使用し、TasEx.Run を使用して、コードを実行する新しいスレッドを作成します。
私の疑問はこの点にあります。void を返す非同期メソッドを作成する方法のいくつかの例では、この方法 (Task.Run または TaskEx.Run) を使用しています。
私が間違っていなければ、Task.Run はメソッドを実行する新しいスレッドを作成します。次に、タスクで新しいスレッドを作成し、メインスレッドをブロックせずに、必要なものを取得する場合、なぜ非同期メソッドを使用するのですか?
また、非同期メソッドが共有変数にアクセスする場合は、同時実行性に注意する必要がありますよね? したがって、少なくともこの場合、非同期メソッドを使用する利点はわかりません。
実際、async も await も使用せずに同じコードを使用すると、結果は同じで、メイン プログラムはブロックされず、すべて期待どおりに動作します。メソッドは次のとおりです。
private void method01Async()
{
TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("Exit method01Async: " + System.DateTime.Now);
});
}
私の質問は、これはメソッドが void を返すときに async を使用する正しい方法ですか?