1

我想为大量内部 .net 应用程序提供一种轻量级的方式来宣布它们正在被使用。我的目标是跟踪哪些用户可能会从支持签到和/或升级提醒中受益。

这是在内部网络上。所有机器之间肯定有IP连接,可能还有UDP。(但可能不是多播。)

写入已知的内部共享或加载已知的 URL 是可能的,但我希望尽可能完全地减少对应用程序本身的影响,即使以牺牲可靠性为代价。所以我宁愿不冒超时的风险(例如,如果我正在访问一些集中式资源并且它已经消失了),理想情况下我也不想启动工作线程。

允许多个听众也很好,这是我考虑广播而不是调用服务的另一个原因。

是否有某种我可以安全有效地使用的即发即弃广播机制?

4

4 回答 4

1

对此当然有很多选择,但一个很容易实现且符合您的标准的选择是异步 Web 服务调用。

这不需要您启动工作线程(框架将在后台执行此操作)。与其使用该链接中概述的选项之一来获取结果,不如简单地忽略结果,因为它对调用应用程序毫无意义。

于 2009-11-30T18:51:36.813 回答
0

经过一些实验,我使用 Win32 mailslots得到了很好的结果。

没有官方的托管包装器,但是通过 PInvoke 可以轻松使用这些功能,如this one这样的示例所示。

使用“域”邮槽提供了真正的广播机制,允许多个侦听器并且不需要知名服务器。

于 2009-12-03T15:14:32.170 回答
0

我做了类似的事情,虽然不完全是“广播”

我有几个非技术人员在公司使用的内部工具。我让它检查特定 EXE 的网络共享(如果您想使用它,您将下载相同的 EXE)并将该文件的版本号与正在执行的程序集进行比较。如果网络上的版本较新,请提醒用户下载新版本。

比尝试为仅与我在同一建筑物内使用的东西设置自动更新程序要简单得多。

于 2009-11-30T19:01:14.137 回答
0

如果升级不是问题(即没有使用旧版本更好的情况),您可以执行我所做的类似操作:

人们实际启动的应用程序是一个更新程序,它检查网络共享上的文件版本和时间戳,如果存在更新版本,则将其复制到程序目录。然后它运行程序(无论它是否已更新)。

var current = new FileInfo(local);
var latest = new FileInfo(remote);

if (!current.Exists)
    latest.CopyTo(local);

var currentVersion = FileVersionInfo.GetVersionInfo(local);
var latestVersion = FileVersionInfo.GetVersionInfo(remote);

if (latest.CreationTime > current.CreationTime || latestVersion.FileVersion != currentVersion.FileVersion)
    latest.CopyTo(local, true);

Process.Start(local)

我还让程序本身检查更新程序是否需要更新(因为更新程序由于文件锁定而无法自行更新)

于 2009-11-30T19:10:20.857 回答