C# 从Windows服务启动时,窗口不可见

C# 从Windows服务启动时,窗口不可见,c#,wpf,multithreading,windows-services,C#,Wpf,Multithreading,Windows Services,有一个监视给定基础结构的windows服务。 在某些情况下,需要弹出一个表单,用户可以在其中看到一些指标并进行选择 为此,我盯着一个WPF窗口 var thread = new Thread(() => { var w = new MyWindow(); _uis.Add(w); w.Info = sb.ToString(); w.Show(); System.Windows.Threading.Dispatcher.Run();

有一个监视给定基础结构的windows服务。 在某些情况下,需要弹出一个表单,用户可以在其中看到一些指标并进行选择

为此,我盯着一个WPF窗口

var thread = new Thread(() =>
{

    var w = new MyWindow();
    _uis.Add(w);
    w.Info = sb.ToString();
    w.Show();

            System.Windows.Threading.Dispatcher.Run();
});

thread.SetApartmentState(ApartmentState.STA);
thread.Start();
不幸的是,我看不见窗户。 当我在控制台应用程序中托管我的服务业务逻辑时,我可以看到窗口


诀窍何在?

服务无权访问相同的权限(网络服务/本地服务),也无权访问您的桌面

服务本质上是无声的,根本不具备启动windows的能力


控制台应用程序确实具有此功能,控制台应用程序不是windows服务,当然也具有与用户交互的功能。

服务无权访问相同的权限(网络服务/本地服务),也无权访问您的桌面

服务本质上是无声的,根本不具备启动windows的能力


控制台应用程序确实具有此功能,控制台应用程序不是windows服务,当然也具有与用户交互的功能。

您可以拆分功能:

  • 服务进行监控
  • 用于显示来自服务的信号的客户端应用程序
客户端应用程序可以简单地侦听套接字,以获取应该显示给用户的服务消息


机器启动时,服务将启动。应用程序将从每个登录的用户启动。

您可以拆分功能:

  • 服务进行监控
  • 用于显示来自服务的信号的客户端应用程序
客户端应用程序可以简单地侦听套接字,以获取应该显示给用户的服务消息


机器启动时,服务将启动。该应用程序将从每个登录的用户启动。

没有技巧。不要这样做

这种方法与关于服务和UI的成熟实践和模式背道而驰。您不应尝试直接从windows服务显示UI(或交互式UI)

标准做法是编写一个单独的UI应用程序来与windows服务通信。 可以考虑定期更新UI。 Web服务可用于服务和UI应用程序之间的通信

艰难之路

然而,如果你真的想做你最初要求的事情,那就来吧


没有诡计。不要这样做

这种方法与关于服务和UI的成熟实践和模式背道而驰。您不应尝试直接从windows服务显示UI(或交互式UI)

标准做法是编写一个单独的UI应用程序来与windows服务通信。 可以考虑定期更新UI。 Web服务可用于服务和UI应用程序之间的通信

艰难之路

然而,如果你真的想做你最初要求的事情,那就来吧


会话0隔离使从Windows服务显示GUI时的问题复杂化。会话0隔离使从Windows服务显示GUI时的问题复杂化。