当不需要并发时,使用来自静态方法的异步等待模式

时间:2018-11-10 19:01:02

标签: c# async-await

以同步方式运行事物时使用异步/等待模式是否有好处?

例如,在我的应用程序中,我有cron(hangfire)调用的静态方法来执行各种IO绑定任务。一个简单的人为例子是这样的:

static void Run(string[] args)
{
    var data = Test(args);

    //..do stuff with returned data
}

public static List<string> Test(string[] args)
{
    return Db.Select(args);
}

像这样编写这段代码有什么好处:

static void Run(string[] args)
{

    var dataTask = await TestAsync(args);
    dataTask.Wait();

    //..do stuff with returned data
}

public static async Task<List<string>> TestAsync(string[] args)
{
    return await Db.SelectAsync(args);
}

我的同事告诉我,我应该始终使用这种模式,并使用异步方法(如果有的话),因为它们是在后台优化中添加的,但是他无法解释为什么会这样,而且我真的找不到任何明确的解释。

如果我在我的静态方法中使用这种类型的模式编写代码,则最终结果如下:

var data = someMethod();
data.Wait();
var data2 = someOtherMethod(data);
data2.Wait();

我了解在触发大量并发任务时使用异步等待模式,但是当代码源自静态方法并且必须按顺序运行时,这样有什么好处吗?我应该用哪种方式写?

1 个答案:

答案 0 :(得分:3)

  

它是在后台优化中添加的,但是他无法解释为什么会这样

令我惊讶的是,有很多人认为异步始终是最佳选择,但他们却不能说为什么。这在社区中是一个很大的误会。不幸的是,微软有点推崇这一概念。我相信他们这样做是为了简化指导。

异步IO在两件事上有帮助:1)保存线程2)通过取消线程管理使GUI应用程序更容易。

大多数应用程序完全不受正在运行的线程数的限制。对于这些应用程序,异步IO会增加零吞吐量,这会花费额外的CPU并使代码复杂化。我知道,因为我已经测量了吞吐量和可伸缩性。我已经处理了许多应用程序。

尤其是,IO本身不会变得更快。唯一改变的是呼叫的发起和完成方式。这里没有任何IO优化。

在您方便或有证据证明正在运行的线程数会成为问题时,请使用异步。默认情况下,请勿使用它,因为这会降低生产率。还有其他添加错误的方法。工具更糟,代码更长,调试和分析更困难。

当然,如果它是适合该工作的工具,那么使用它没有任何问题。