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