Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#我们可以使用async和alias吗?_C#_Asp.net Core - Fatal编程技术网

C#我们可以使用async和alias吗?

C#我们可以使用async和alias吗?,c#,asp.net-core,C#,Asp.net Core,我正在做一个项目来提高我的技能。我正在尝试编写异步和同步代码。有一个问题我很好奇。我们将“使用”用于一次性处理。我们可以将“using”别名与wait关键字一起使用吗 此代码块在未使用“using”时返回错误。这就是为什么我使用“使用” publicstaticasync任务AddAsync(formfile文件,stringfilepath) { var sourcePath=Path.GetTempFileName(); 如果(file.Length>0) { 使用(var stream=n

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

此代码块在未使用“using”时返回错误。这就是为什么我使用“使用”

publicstaticasync任务AddAsync(formfile文件,stringfilepath)
{
var sourcePath=Path.GetTempFileName();
如果(file.Length>0)
{
使用(var stream=newfilestream(sourcePath,FileMode.Create))
{
等待文件.CopyToAsync(流);
}
}
Move(sourcePath,filePath);
返回文件路径;
}
如果您的C#编译器足够新,它将为此发出正确的代码。我记得当等待是新的,这没有工作;但是,如果您使用的是任何受支持的.NET Core版本,那么这将正常工作

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

最明显的可怕事情就是泄露任务;如果方法抛出而任务泄漏,则Dispose不会运行;但在这种情况下,您不必在意,因为当进程即将消亡时,您不需要清理句柄。

如果您的C#编译器足够新,它将为此发出正确的代码。我记得当等待是新的,这没有工作;但是,如果您使用的是任何受支持的.NET Core版本,那么这将正常工作

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

最明显的可怕事情就是泄露任务;如果方法抛出而任务泄漏,则Dispose不会运行;但在这种情况下,您并不在意,因为当进程即将死亡时,您不需要清理句柄

我们可以将async与alias一起使用吗

对。所有的语言结构在
async
await
中都能按预期工作,包括循环、
使用
尝试
/
捕获
/
最后
等。这就是
async
等待
的全部要点

我们可以将async与alias一起使用吗


对。所有的语言结构在
async
await
中都能按预期工作,包括循环、
使用
尝试
/
捕获
/
最后
等。这就是
async
await

不使用
使用
的全部要点,您有什么错误?使用
使用
通常不是必须的,如果不使用它,代码可能会出现内存泄漏问题,但我从未见过不使用它会立即引发错误;他不能反省自己。@KingKing错误消息是“该进程无法访问该文件,因为它正被另一进程使用。”我在网上搜索过,但这些解决方案对我无效。然后我使用了“using”,代码块开始运行。实际上,如果处理错误,您需要首先刷新流,使用
using
将调用
Dispose
方法,它将为您刷新流。因此,在这之后,新文件可以被移动(重命名)。现在它开始有意义了,感谢您的关注@kingking,在不使用
的情况下使用
,您有什么错误?使用
使用
通常不是必须的,如果不使用它,代码可能会出现内存泄漏问题,但我从未见过不使用它会立即引发错误;他不能反省自己。@KingKing错误消息是“该进程无法访问该文件,因为它正被另一进程使用。”我在网上搜索过,但这些解决方案对我无效。然后我使用了“using”,代码块开始运行。实际上,如果处理错误,您需要首先刷新流,使用
using
将调用
Dispose
方法,它将为您刷新流。在那之后,新文件可以被移动(重命名)。现在它开始有意义了,谢谢你的关注@kingking谢谢你的回复,你的回复帮助我理解了这个主题。
C#编译器足够新了
-即VS 2012或更新版本。只有VS 2010存在这种编译器问题。感谢您的回复,您的回复帮助我了解了这个主题。
C#编译器足够新了
——即VS 2012或更新版本。只有VS2010存在这种编译器问题。
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;
        }