从泛型方法

时间:2017-04-30 15:36:40

标签: c# generics windows-services

我觉得我在这里缺少一些非常简单的东西。代码如下:

public partial class DatabaseService : ServiceBase
{
    internal static ServiceHost incomingCallServiceHost;
    internal static ServiceHost personServiceHost;

    public DatabaseService()
    {
        InitializeComponent();
    }

    private void StartService<TService>(ServiceHost svchost)
    {
        svchost?.Close();
        svchost = new ServiceHost(typeof(TService));
        svchost.Open();
    }

    private void StopService(ServiceHost svchost)
    {
        if (svchost != null)
        {
            svchost.Close();
            svchost = null;
        }
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            StartService<IncomingCallService>(incomingCallServiceHost);
            StartService<PersonService>(personServiceHost);
        }
        catch(System.Exception ex)
        {
            EventLog.WriteEntry(ex.Message);
        }           
    }

    protected override void OnStop()
    {
        StopService(incomingCallServiceHost);
        StopService(personServiceHost);
    }
}

编译此代码时,会警告两个ServiceHost变量永远不会初始化,并且始终为null。

我可以将变量初始化的唯一方法是从StartService方法中获取代码并将其放入OnStart方法中,这会创建重复且重复的代码。

protected override void OnStart(string[] args)
{
    try
    {
        incomingCallServiceHost?.Close();
        incomingCallServiceHost = new ServiceHost(typeof(IncomingCallService));
        incomingCallServiceHost.Open();

        personServiceHost?.Close();
        personServiceHost = new ServiceHost(typeof(PersonService));
        personServiceHost.Open();
    }
    catch(System.Exception ex)
    {
        EventLog.WriteEntry(ex.Message);
    }           
}

感觉就像通用方法应该在这里工作,但事实并非如此。这是为什么?

1 个答案:

答案 0 :(得分:0)

本来应该提出这个,但Evk得到了正确答案。需要在ServiceHost参数上使用ref关键字。