不,async
/await
关键字与并发性有关。async
/await
基本上将您的方法代码包装到任务和延续中。要查看编译器生成的确切翻译(使用任务并行库),请反汇编一些代码片段。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);
或者,您可以将 TPL 代码放入Result
方法中
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 代码设置上下文。