C#服务的MessageBox.Show()的替代方案

C#服务的MessageBox.Show()的替代方案,c#,.net,dialog,C#,.net,Dialog,在Windows XP中,MessageBox.Show()是一种可行的方法,可以在我们的服务因未知原因无法启动时提示用户。但是,在Vista和更高版本中,服务不再显示此消息,这是可以理解的,因为大多数情况下使用对话框阻止服务是不可取的。对于服务,MessageBox.Show()有哪些(最好是非阻塞的)替代方案可用?使用系统事件日志:Windows服务遇到错误时应写入Windows事件日志。 最好是应用程序日志 您需要为服务创建一个事件源,要做到这一点,您需要管理员权限,因此这应该在安装过程中

在Windows XP中,MessageBox.Show()是一种可行的方法,可以在我们的服务因未知原因无法启动时提示用户。但是,在Vista和更高版本中,服务不再显示此消息,这是可以理解的,因为大多数情况下使用对话框阻止服务是不可取的。对于服务,MessageBox.Show()有哪些(最好是非阻塞的)替代方案可用?

使用系统事件日志:

Windows服务遇到错误时应写入Windows事件日志。 最好是应用程序日志

您需要为服务创建一个事件源,要做到这一点,您需要管理员权限,因此这应该在安装过程中完成。

声明:

private static TraceSource _traceSource = new TraceSource("YourSourceName");
用法,请参阅:

配置:

 <system.diagnostics>
      <sources>
           <source name="YourSourceName" switchValue="All" switchType="System.Diagnostics.SourceSwitch">
                <listeners>
                     <add name="eventLog" />
                </listeners>
      </source>
    <trace autoflush="true">
        <listeners>
            <add name="eventLog" />
        </listeners>
    </trace>
    <sharedListeners>
        <add name="eventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="SourceName" />
    </sharedListeners>
 </system.diagnostics>

日志记录是告知用户服务问题的唯一正确方法。
事件日志是系统登录服务的首选日志。

通常使用事件日志来记录(例如,服务启动/停止和错误等)


如果需要其他跟踪,请使用System.Diagnostics.Trace或Debug,然后使用DebugView之类的工具进行监视。

您有两个基本选项:

  • 创建在系统托盘中运行的特定于用户的启动应用程序。此应用程序将连接到该服务并从中接收消息(这与反病毒程序的运行方式类似)

  • 将所有消息和异常写入事件日志。对于关键问题,可以使用应用程序事件日志,对于信息或诊断消息,可以使用特定于应用程序的事件日志


  • 上述选项并非相互排斥,您应该始终实现#2。

    写入事件日志如何?您试图解决的问题是什么?是否要从服务中提示交互式用户?您确定服务是问题域的最佳模型吗?我们已经写入事件日志和%APPDATA%中的日志文件。我想用一种直观的方式让用户知道出了什么问题。@BasedAsFunk:那么你需要使用后台进程(一个隐藏表单的应用程序),而不是windows服务。
     <system.diagnostics>
          <sources>
               <source name="YourSourceName" switchValue="All" switchType="System.Diagnostics.SourceSwitch">
                    <listeners>
                         <add name="eventLog" />
                    </listeners>
          </source>
        <trace autoflush="true">
            <listeners>
                <add name="eventLog" />
            </listeners>
        </trace>
        <sharedListeners>
            <add name="eventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="SourceName" />
        </sharedListeners>
     </system.diagnostics>