关于File.ReadAllBytesAsync无法被取消的技术问题求助
File.ReadAllBytesAsync取消操作未生效的问题
我发现File.ReadAllBytesAsync的行为存在异常:当取消该方法返回的任务时,它仍会继续运行直至读取完整文件。调用测试方法后对比源文件(fileFrom)和目标文件(fileTo)的SHA256,结果完全一致。读取的文件约1GB且位于HDD上,10毫秒内不可能完成读取,显然取消操作未生效。
初始测试代码:
public async void Test(string fileFrom, string fileTo) { CancellationTokenSource source = new CancellationTokenSource(); Task<byte[]> task = File.ReadAllBytesAsync(fileFrom, source.Token); Thread.Sleep(10); source.Cancel(); byte[] bytes = await task; Debug.WriteLine(bytes.Length.ToString()); File.WriteAllBytes(fileTo, bytes); }
编辑补充
@Panagiotis Kanavos指出上述代码存在若干问题,我修改后使用近2GB的文件再次测试,结果依然相同。新版本演示代码输出内容为Test: 16264 ms, 2146435071 Bytes.:
修改后的测试代码:
public async Task Test(string fileFrom, string fileTo) { CancellationTokenSource source = new CancellationTokenSource(20); Task<byte[]> task = File.ReadAllBytesAsync(fileFrom, source.Token); Stopwatch watch = Stopwatch.StartNew(); byte[] bytes = await task; watch.Stop(); Debug.WriteLine($"Test: {watch.ElapsedMilliseconds} ms, {bytes.Length} Bytes."); File.WriteAllBytes(fileTo, bytes); }
内容的提问来源于stack exchange,提问作者AlpacaMan
相关产品推荐
相关产品推荐

