您能告诉我在完全异步的 WCF 服务中复制文件时使用什么更正确吗?
System.IO.File.Copy(sourceFileName: full_path_temp_file, destFileName:
full_path_file);
或者
await stream.CopyToAsync(destination: file_stream);
我已经在https://referencesource.microsoft.com上查看了这两种方法的代码,File.Copy 是通过 WinAPI 调用实现的,即 完全非托管代码,与 Stream.CopyToAsync 不同,但不幸的是 File.Copy 不是异步的,即 它会阻塞 WCF 的关键资源(如线程),通常这会对服务的性能产生不利影响。
(从评论中的讨论中删除。)
CopyToAsync
是一个更通用的函数,因为它适用于任意线程。因此,理论上它可能比直接调用更慢、更不理想File.Copy
(例如,由于缓冲区大小的不同选择)。但是,差异通常可以忽略不计,因为文件系统操作通常比流和上下文切换操作慢得多。这意味着访问和响应文件系统的时间应该支配复制函数的总执行时间。
我建议对您的应用程序的典型文件大小和文件系统负载的调用进行分析。(不幸的是,我们不知道您的系统的典型数据是什么,因此我们的测试可能不会显示与您的相同的性能。)[只是不要在分析过程中连续多次复制同一个文件,否则操作系统缓存和分析结果将不正确。]
我敢打赌,这两个函数将显示大致相同的时间,在这种情况下,异步选项肯定更好。如果突然发现异步选项在您的数据上确实慢得多,那么只有考虑什么对您的程序更重要才有意义 - 不要占用额外的线程或更快地复制。(为此,可能再次需要分析 - 我们将在哪个选项中每单位时间为更多客户提供服务?)