【问题标题】:Write async method correctly正确编写异步方法
【发布时间】:2015-05-17 09:53:50
【问题描述】:

我已经使用异步方法很长时间了,但是我不知道编写自己的异步方法的正确方法。据我所知,第一个根(我的意思是最深的)异步方法从包装在任务中的同步方法开始?我对吗?编写此类方法的正确模式是什么?现在我这样做:

private async Task DoSomethingAsync()
{
    var tsk = new Task(OnDo);
    tsk.Start();
    await tsk.ConfigureAwait(false);
}

private void OnDo()
{
    // Do stuff ...
}

【问题讨论】:

  • 如果'root'方法是同步的,它就是同步的。不要通过在另一个线程上运行来伪造异步。详情请见this blog post
  • 一个好的答案是页面长。我认为您需要阅读一些基础教程。
  • @CharlesMager,很棒的文章,解释了很多。谢谢。
  • 也许我的回答here 能有所启发。

标签: c# asynchronous methods async-await task-parallel-library


【解决方案1】:

实际答案太长,无法在此处发布。

简答

不,您不应该从同步方法中调用异步方法。方法树应该是自下而上异步的。

例如:使用 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 应用程序,您应该有 async void 事件方法,它调用您的异步方法。

private async void button1_Click(object sender, RoutedEventArgs e)
{
    textBlock1.Text = "Click Started";
    await DoWork();
    textBlock2.Text = "Click Finished";
}

不管怎样,这个问题太宽泛了。

  • 您的“待实施”方法是什么?
  • 为什么要异步?
  • 您使用的是什么环境?

通常异步用于 I/O 操作(数据库、网络、文件读/写)或并行性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-17
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多