Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从共享网络文件夹运行的.NET应用程序的性能惩罚_.net - Fatal编程技术网

从共享网络文件夹运行的.NET应用程序的性能惩罚

从共享网络文件夹运行的.NET应用程序的性能惩罚,.net,.net,从共享网络文件夹运行.NET 4.0应用程序时是否存在性能问题?我发现哪个应用程序启动较慢,但在使用时没有注意到任何减速,但不确定 在网络上运行可执行文件时,Windows不会在应用程序启动时将整个应用程序带到网络上。这样做是为了加快启动时间(如果您从未真正使用过700MB的嵌入式AVI资源,那么下载它就没有意义了) 这意味着,当需要来自可执行映像的新页面时,Windows将定期返回网络以检索它们 实现这一点的方法是,如果您的应用程序碰巧遇到一个不存在的内存页,将触发一个标准的页面错误,告诉Wi

从共享网络文件夹运行.NET 4.0应用程序时是否存在性能问题?我发现哪个应用程序启动较慢,但在使用时没有注意到任何减速,但不确定

在网络上运行可执行文件时,Windows不会在应用程序启动时将整个应用程序带到网络上。这样做是为了加快启动时间(如果您从未真正使用过700MB的嵌入式AVI资源,那么下载它就没有意义了)

这意味着,当需要来自可执行映像的新页面时,Windows将定期返回网络以检索它们

实现这一点的方法是,如果您的应用程序碰巧遇到一个不存在的内存页,将触发一个标准的页面错误,告诉Windows它需要填充该页。如果此时网络恰好关闭,Windows将无法满足页面错误。无法从中恢复,因此Windows会抛出一个(0xC0000005)

有三种方法可以处理此问题:

  • 什么都不做,让应用程序死掉。告诉客户修复他们的网络
  • 捕获错误,解释应用程序必须立即终止,并告诉用户他们的网络应该负责
  • 设置PE图像选项。这将指示Windows在应用程序加载时通过网络复制整个可执行文件。这将增加网络流量和用户等待时间(在应用程序启动时),但可以避免错误

是的,这在Windows中进行了大量优化。加载.NET程序集实际上并不涉及读取程序集。与本机代码非常相似,CLR为程序集文件创建内存映射文件。与文件一样大的虚拟内存块,其页面标记为“尚未加载”

然后JIT编译器开始读取IL并为其生成机器代码。不可避免地,它将尝试读取仍处于“尚未加载”状态的内存页,这将产生低级处理器页错误。Windows会捕获该故障,然后实际读取文件内容并将其加载到RAM中。抖动继续,好像什么也没发生


当程序集位于网络共享上时,读取该页的速度会变慢。但是由于抖动只在实际需要执行程序时编译IL,因此很难注意到速度的减慢,它只会给每个页面错误增加几毫秒。当您的程序启动时,这一点最为明显,这是在程序可以执行诸如显示其主窗口之类的操作之前需要编译大量IL的唯一实时操作。

可能是因为网络访问通常比本地访问慢?另一个原因是在首次启动时Windows和.net会执行一些优化和缓存结果。他们可能不会将其应用于从网络加载的应用程序。@Boas Enkler一个可能的原因是免费更新,用户总是获得最新版本。“我猜,”博阿森克勒说,“另一个原因是它是一种安全功能。每个人都可以访问他们机器上的可执行文件,这意味着他们可以用恶意代码替换我的可执行文件software@Andrey:在这种情况下,ClickOnce将是更好的解决方案。我会选择#1和#2的组合:优雅地退出,告诉客户修复他们的网络^^ 3当然也很好,但如果通过通常的慢如爬行的VPN,那将是一场噩梦……:)