いいえ、async
/await
キーワードはすべて同時実行に関係しています。async
/await
基本的に、メソッド コードをタスクと継続にラップします。コンパイラが (Task Parallel Library を使用して) 生成した正確な変換を確認するには、一部のコード スニペットを逆アセンブルします。async
/のこの翻訳はawait
、以下の例と「類似」しています (ただし同一ではありません!)。
async Task<int> TaskOfTResult_MethodAsync()
{
int hours;
// . . .
// Return statement specifies an integer result.
return hours;
}
// Calls to TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
int intResult = await returnedTaskTResult;
// or, in a single statement
int intResult = await TaskOfTResult_MethodAsync();
これはおおよそ次のように変換されます
private int Result()
{
int hours;
// . . .
// Return statement specifies an integer result.
return hours;
}
メソッドの外側でリターンを待つ場所
int? hours = null;
Task<int> task = null;
task = Task.Factory.StartNew<int>(() => Result());
task.ContnueWith(cont =>
{
// Some task completion checking...
hours = task.Result;
}, CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Current);
Result
または、TPL コードをメソッドに配置することもできます。
private int ResultAsync()
{
int? hours = null;
Task<int> task = null;
task = Task.Factory.StartNew<int>(() =>
{
int hours;
// . . .
// Return statement specifies an integer result.
return hours;
}, CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Current);
try
{
return task.Result;
}
catch (AggregateException aggEx)
{
// Some handler method for the agg exception.
aggEx.Handle(HandleException);
}
}
SynchronizationContext
async
/awate
コードの同じスレッドで継続が実行されることを保証するものではありません。ただし、SynchronisationContex
キーワードを介して TPL コードを使用してコンテキストを設定できます。