首页 > 解决方案 > C# 我们可以通过使用别名来使用异步吗?

问题描述

我正在做一个项目来提高我的技能。我正在尝试一起编写异步和同步代码。有一个问题我很好奇。我们将“使用”用于一次性处理。我们可以将“使用”别名与 await 关键字一起使用吗?

此代码块在未使用“使用”的情况下返回错误。这就是我使用“使用”的原因。

public static async Task<string> AddAsync(IFormFile file, string filePath)
        {
            var sourcePath = Path.GetTempFileName();
            if (file.Length > 0)
            {
                using (var stream = new FileStream(sourcePath, FileMode.Create))
                {
                    await file.CopyToAsync(stream);
                }
                
            }

            File.Move(sourcePath, filePath);
            return filePath;
        }

标签: c#asp.net-core

解决方案


如果您的 C# 编译器足够新,它将为此发出正确的代码。我记得什么时候 await 是新的,但这不起作用;但如果您使用任何受支持的 .NET Core 版本,这将正常工作。

代码生成有一个令人惊讶的神器;using 不会变成真正的 finally 块;如果上面的代码对它可能无法运行的任务做了一些糟糕的事情(它变成了合成状态对象的 dispose 方法);但如果您使用任何正常模式,它都会起作用。

最明显的可怕情况是泄露任务;如果方法抛出并且任务泄露,则 Dispose 永远不会运行;但是在这种情况下,您不必在意,因为无论如何当进程将要终止时,您都不需要清理句柄。


推荐阅读