我有一个C#服务(.NET 4.6.2)来轮询在线API。绑在那上面也是一个托盘图标。该服务应该保持托盘图标运行,该图标应该保持服务运行。
如果服务因任何原因必须重新启动托盘图标,那么它会,但图标不会返回。我试图解决这个问题,因为用户认为如果图标不在那里它不起作用。当他们重新启动应用程序并重新获取图标时,它会运行:
Process process = Process.GetCurrentProcess();
var dupl = (Process.GetProcessesByName(process.ProcessName));
if (dupl.Length > 1)
{
foreach (var p in dupl)
{
if (p.Id != process.Id)
p.Kill();
}
}
确保任何时候只有一个副本。我意识到服务不应该直接访问UI,但是没有间接方法吗?我可以通过另一个DLL或其他东西传递我的电话吗?
我已经对此进行了相当多的研究,并找到了很多资源,最终过时了。即使是去年的这个看起来很有希望也没有用。 How to create process as user with arguments
此服务部署在从Windows 32位到Windows 10的计算机上。并不总是有用户登录,但为了简单起见,我们假设有以后可以错误处理其余部分。
实际上,您的服务不应该与用户交互,如果您发现一篇文章无论如何都会讨论如何操作,它迟早会失败。
正确的方法是拥有两个应用程序。服务和用户界面。该服务作为服务运行。用户界面应用程序以用户身份启动(可能来自其自动启动)。然后这两个应用程序通过某种IPC进行通信,可能是套接字或管道。用户界面可以显示托盘图标并显示从服务获得的状态消息,或者它可以通过例如托盘图标上下文菜单将命令发送到从用户获得的服务。
所以不要试图伪造解决方案。它将无法正常工作,因为它不应该正常工作。构建两个应用程序