【问题标题】:Execute a method on an existing process instance. Vb.Net在现有流程实例上执行方法。网络
【发布时间】:2012-05-16 20:24:17
【问题描述】:

我有一个在 Vb.Net 中编写的 Windows 服务。作为该服务的一部分,它调用一个具有长时间运行进程的类。

当我想通过服务中的 ServerCommands() 类时,我可以对这个进程执行命令,但是我想远程调用这些命令。可能来自网站或单击一次 WPF 应用程序。

为此,我使用了一个简单的 Tcp.Ip WCF 示例,并已验证它工作正常。

这称为 OnStart()

Private _serverCommands As ServerCommands

Protected Overrides Sub OnStart(ByVal args() As String)
    ' Add code here to start your service. This method should set things
    ' in motion so your service can do its work.

    Debugger.Launch()

    ' Action a new implementaion of the WCF Service on localhost
    _host.AddServiceEndpoint(GetType(ICommunicationService), New NetTcpBinding(), String.Format("net.tcp://127.0.0.1:{0}", AppSettings.TcpServicePort))
    _host.Open()

    ' Start the server command
    _serverCommands = New ServerCommands()
    _serverCommands.StartServer()

End Sub

但是...当我通过 WCF 调用服务时,它会启动 ServerCommands() 类的新实例,而不是附加到已经运行的线程。

下面的调用

Public Function DoWork() As String Implements ICommunicationService.DoWork
    Dim command As String = "say hello world"

    Dim service As IMinecraftService = New MinecraftService()
    service.ExecuteServerSideCommand(command)

    Return "Command Executed"
End Function

在主服务上实现这一点。

Public Sub ExecuteServerSideCommand(command As String) Implements IMinecraftService.ExecuteServerSideCommand
    If (_serverCommands IsNot Nothing) Then
        _serverCommands.SendCommand(command)
    End If
End Sub

在调试 _serverCommands 应该运行时似乎是 Nothing。

如何确保我通过 WCF 执行的任何命令与正在运行的实例进行通信,而不是创建一个新的 ServerCommand() 实例??

我以前没有尝试过 WCF,所以我可能会遇到死胡同……但我确信它是可能的。

提前致谢。

【问题讨论】:

  • 您何时/何地/如何启动线程?是在ServerCommand.SendCommand 方法中吗?
  • 感谢您的及时回复。 Process 本身在 ServerCommands 类中启动, Process.Start() 我称之为的唯一地方是'启动服务器命令 _serverCommands = New ServerCommands() _serverCommands.StartServer()
  • 你在哪里创建_serverCommands,你在哪里打电话给_serverCommands.StartServer()?听起来您可能没有在请求之间共享 _serverCommand 对象。
  • 我称之为它的唯一其他地方是在我已添加到我上面的代码中的 WCF 服务上。
  • 嗨,杰夫,感谢您的帮助。我将其更改为公共共享服务器命令并且有效!

标签: vb.net wcf windows-services


【解决方案1】:

我发现每次通过 WCF 发送命令时,我都在调用一个新的 MinecraftService 实例。

正如 Jeff 所说,我没有让对象共享,我只是在访问这个类的一个新实例。

我改了

来自

我的主类

    Private _serverCommands As ServerCommands

我的 WcfService

    Dim command As String = "say hello world"
    MinecraftService.ServerCommands.SendCommand(command)

我的主类

    Public Shared ServerCommands As ServerCommands

我的 WcfService

    MinecraftService.ServerCommands.SendCommand(command)

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2020-05-05
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2015-06-09
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多