【问题标题】:Starting a WCF from its own class constructor从自己的类构造函数启动 WCF
【发布时间】:2016-09-27 01:59:37
【问题描述】:

我有一个托管在类库中的自托管命名管道(不使用 http)wcf。我可以通过在类库中使用以下方法来启动 WCF:

ServiceHost serviceHost;
public void startService()
{
    // Create the service host
    ...
    // Open Service Host
    serviceHost.Open();
}

然后从一个winforms测试程序中运行以下按钮:

MyClassLib.MySvc testSvc;
private void button2_Click(object sender, EventArgs e)
{
    testSvc = new MyClassLib.MySvc();
    testSvc.startService();
}

这确实会正确启动在类库中运行的 WCF。

但这需要引用类库的winforms调用startService方法。

我想要的只是能够在对将运行 WCF 的类库的引用完成后立即启动服务。

我尝试在类库服务的构造函数中添加以下内容:

public MySvc()
{
    startService();
}

然后从winforms实例化:

MyClassLib.MySvc testSvc;
private void button2_Click(object sender, EventArgs e)
{
    testSvc = new MyClassLib.MySvc();
    //testSvc.startService();  //No need to call this
}

如果我调试代码,我可以看到实际上它在这一点上确实中断了:

public MySvc()
{
    startService();  // It does run this but service does not start
}

但这不会运行服务。任何帮助将不胜感激。

注意 #1:我认为这是某种时间问题,它不允许您在构造函数方法期间启动服务,但不确定。

【问题讨论】:

  • 您有一个MySvc 的构造函数,但您的代码中调用该构造函数的是什么? (提示:可能什么都没有)。你需要一些入口点。看看你的 Winforms 应用程序。有一个带有静态 Main 方法的 Program.cs 文件。这就是入口点。
  • 构造函数是类库中服务类的名称。当我从 winforms 实例化类库时,它被调用。它甚至调用了 startService 方法,但服务并没有以这种方式启动。

标签: c# wcf


【解决方案1】:

问题已解决,是的,我的假设是时间问题(参见上面的 Note# 1)是正确的!

要复制,请更改:

public MySvc()
{
    startService();  // It does run this but service does not start
}

至此,问题已解决:

public void delayStartService()
{
    Task.Delay(1000).ContinueWith(t => startService());
}

public MySvc()
{
    delayStartService();
}

【讨论】:

  • Task.Delay(1000).ContinueWith 这让你感觉对吗?为什么是1000?为什么不是 10 或 10000?它会在每次运行时都起作用吗?...
  • 我可以发布一个不依赖于经验时间的更好的,但不是在此响应之后...继续您的解决方案。
  • 你可以这样做!但是,伙计,随你便吧。
猜你喜欢
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 2021-03-26
相关资源
最近更新 更多