C# CancellationToken是否删除文件锁?
我有以下异步函数:C# CancellationToken是否删除文件锁?,c#,wpf,asynchronous,cancellation-token,C#,Wpf,Asynchronous,Cancellation Token,我有以下异步函数: private async Task<bool> ValidateFtpAsync() { return await Task.Run( () => { if(File.Exists("settings.xml")) { var xs = new XmlSerializer(typeo
private async Task<bool> ValidateFtpAsync()
{
return await Task.Run(
() =>
{
if(File.Exists("settings.xml"))
{
var xs = new XmlSerializer(typeof(Information));
using (var read = new FileStream("settings.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
{
Information info = (Information)xs.Deserialize(read);
try
{
var DecryptedInfo = FileCryptoDecryptor.ReadEncryptedConfiguration("hakuna.xml.aes", Global_Variables.AppPassword);
string DecryptedFTPPass = EncryDecryptor.Decrypt(DecryptedInfo.FtpPassword, "UltraSecretPasswordNotGonnaSayItToYou");
return General_Functions.isValidConnection(info.HDSynologyIP, info.FtpUsername, DecryptedFTPPass);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
return false;
}
else
{
MessageBox.Show("Missing settings file.");
return false;
}
});
}
private async Task validateftpsync()
{
返回等待任务。运行(
() =>
{
if(File.Exists(“settings.xml”))
{
var xs=新的XmlSerializer(typeof(Information));
使用(var read=new FileStream(“settings.xml”、FileMode.Open、FileAccess.ReadWrite、FileShare.ReadWrite))
{
信息信息=(信息)xs.反序列化(读取);
尝试
{
var DecryptedInfo=FileCryptoDecryptor.ReadEncryptedConfiguration(“hakuna.xml.aes”,Global_Variables.AppPassword);
string DecryptedFTPPass=EncryDecryptor.Decrypt(DecryptedInfo.FtpPassword,“UltraSecretPasswordNotGonnaSayItToYou”);
返回常规函数.isValidConnection(info.HDSynologyIP、info.FtpUsername、DecryptedFTPPass);
}
捕获(例外情况除外)
{
Show(例如ToString());
}
}
返回false;
}
其他的
{
Show(“缺少设置文件”);
返回false;
}
});
}
您可以看到它从文件中读取数据。我的问题是,如果我使用CancellationToken for async方法,它在使用块时是否会删除文件锁?否,取消令牌本身不会做任何事情(尤其是不会关闭文件)。任务的代码需要反复检查令牌的状态,并相应地执行取消操作
目前还不清楚您打算在何处使用取消令牌,因为没有重复操作。。。但是,由于代码已经正确地设置了
using(…){}
语句,无论您在何处中断操作,文件都将在finally
using(var read=new FileStream)的块中正确关闭(…
我应该这样想,因为using块将超出范围。当您从令牌源使用Cancel时,任务
将抛出一个任务取消异常
,因此所有持有的资源都将被释放,包括您对文件的锁定。@MickyD我有它来加载动画。它的解密文件及其获取有一段时间,我是异步的,这样我就不会阻塞gui,可以显示加载动画。我还没有找到更好的解决方案,但还是初学者,我的第一个项目还在学习。TPL数据流将是一个更好的选择。你仍然不应该依赖在线程池线程中工作的UI操作锁将被删除,但不是作为取消的直接效果ationToken
。CancelationToken
的唯一职责是抛出一个OperationCanceledException
。