在现有流程实例上执行方法。 Vb.Net

时间:2012-05-16 20:24:17

标签: vb.net wcf windows-services

我有一个我在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,所以我可能会遇到死胡同...但是我确信它可能。

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

正如杰夫正确地说的那样,我没有让对象共享,我只是访问了这个类的新实例。

我从

改变了它

MyMainClass

    Private _serverCommands As ServerCommands

我的WcfService

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

MyMainClass

    Public Shared ServerCommands As ServerCommands

我的WcfService

    MinecraftService.ServerCommands.SendCommand(command)