正确编写异步方法
Write async method correctly
我已经使用异步方法很长时间了,但我不知道如何正确编写自己的异步方法。据我所知,第一个根(我的意思是最深的)异步方法从包装在任务中的同步方法开始?我对吗?编写此类方法的正确模式是什么?现在我是这样做的:
private async Task DoSomethingAsync()
{
var tsk = new Task(OnDo);
tsk.Start();
await tsk.ConfigureAwait(false);
}
private void OnDo()
{
// Do stuff ...
}
这里的实际答案太长 post。
简答
不,您不应该从同步方法调用异步方法。方法树应该是从下到上异步的。
例如:使用 ASP.NET MVC 异步方法将从异步 Action 方法调用,请参阅:Using Asynchronous Methods in ASP.NET MVC 4。
public async Task<ActionResult> GizmosAsync()
{
ViewBag.SyncOrAsync = "Asynchronous";
var gizmoService = new GizmoService();
return View("Gizmos", await gizmoService.GetGizmosAsync());
}
使用 WPF 应用程序,您应该有调用异步方法的异步无效事件方法。
private async void button1_Click(object sender, RoutedEventArgs e)
{
textBlock1.Text = "Click Started";
await DoWork();
textBlock2.Text = "Click Finished";
}
不管怎样,这个问题太宽泛了。
- 你的“待实施”方法是什么?
- 为什么要异步?
- 您使用的是什么环境?
一般异步用于I/O操作(数据库、网络、文件read/write)或并行。
我已经使用异步方法很长时间了,但我不知道如何正确编写自己的异步方法。据我所知,第一个根(我的意思是最深的)异步方法从包装在任务中的同步方法开始?我对吗?编写此类方法的正确模式是什么?现在我是这样做的:
private async Task DoSomethingAsync()
{
var tsk = new Task(OnDo);
tsk.Start();
await tsk.ConfigureAwait(false);
}
private void OnDo()
{
// Do stuff ...
}
这里的实际答案太长 post。
简答
不,您不应该从同步方法调用异步方法。方法树应该是从下到上异步的。
例如:使用 ASP.NET MVC 异步方法将从异步 Action 方法调用,请参阅:Using Asynchronous Methods in ASP.NET MVC 4。
public async Task<ActionResult> GizmosAsync()
{
ViewBag.SyncOrAsync = "Asynchronous";
var gizmoService = new GizmoService();
return View("Gizmos", await gizmoService.GetGizmosAsync());
}
使用 WPF 应用程序,您应该有调用异步方法的异步无效事件方法。
private async void button1_Click(object sender, RoutedEventArgs e)
{
textBlock1.Text = "Click Started";
await DoWork();
textBlock2.Text = "Click Finished";
}
不管怎样,这个问题太宽泛了。
- 你的“待实施”方法是什么?
- 为什么要异步?
- 您使用的是什么环境?
一般异步用于I/O操作(数据库、网络、文件read/write)或并行。