在引入一个简单的等待时,如何避免异步方法爆炸?

时间:2016-08-29 08:21:58

标签: c# async-await

比如说我有一个方法可以将一些数据写入文件

public void Foo()
{
    using (var file = File.OpenWrite(@"C:\Temp\foo.txt"))
    {
        var writer = new StreamWriter(file);
        writer.WriteLine("foo");
        // some other code
    }
}

这引入了少量滞后。我决定使用异步IO来修复它。我将我的方法更改为以下内容:

public async Task FooAsync()
{
    using (var file = File.OpenWrite(@"C:\Temp\foo.txt"))
    {
        var writer = new StreamWriter(file);
        await writer.WriteLineAsync("foo");
        // some other code
    }
}

由于async void被认为是邪恶的,我将返回类型更改为Task

现在在调用方法中,我有一个未经等待的Task,这很糟糕。所以我也将该方法的签名更改为async Task。该方法的父级也是如此。然后该方法是接口的一部分,该接口应返回void,因此我更改接口中的方法以返回Task。但还有另一个实现,现在也需要返回Task。我解决了这个问题,还有一些调用方法等等。

现在最终有20个async方法和2小时的花费时间,都是因为我想做一个简单的异步文件写。

我该如何避免这种情况?我是否应该在某个时候等待退回的Task?或者我真的需要经历这一切吗?

1 个答案:

答案 0 :(得分:2)

  

这引入了少量滞后。我决定使用异步IO修复它。

异步IO通常不会使代码更快,它会消耗更少的资源(特别是线程,因此也会占用内存)。

如果您希望使代码更具可扩展性,或者如果您不想阻止UI线程,define('HOST','***'); define('USER','***'); define('PASS','***'); define('DB','***'); $con = mysqli_connect(HOST,USER,PASS,DB) or die('Unable to Connect'); mysqli_set_charset( $con, 'utf8'); $sql = "INSERT INTO users (username, precio, text_cli, l_origen, l_destino, num_pal) VALUES('$user','$precio','$texto','$l_origen','$l_destino','$num_pal')"; 将对您有所帮助。如果您想让代码更快,async可能根本不会帮助您。