C#我们可以使用async和alias吗?
我正在做一个项目来提高我的技能。我正在尝试编写异步和同步代码。有一个问题我很好奇。我们将“使用”用于一次性处理。我们可以将“using”别名与wait关键字一起使用吗 此代码块在未使用“using”时返回错误。这就是为什么我使用“使用”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
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;
}