0

我需要在我的客户端应用程序中托管一项服务,以将数据暴露给也嵌入在我的客户端中的 OEM 软件。

有哪些线程选项可用?目前我使用以下类似的东西:

var host = new ServiceHost(...);
var serviceThread = new System.Threading.Thread(host.Open);
serviceThread.Start();

我遇到的问题是在我调用 serviceThread.Start() 之后我想检查服务是否正在运行,但是服务需要不同的时间来启动或失败。

使用 Thread.Sleep(x) 似乎不正确。有哪些替代方案?

谢谢。

[编辑]

在尝试了 maralfol 建议后,我得到了一些奇怪的行为,我的主线程被劫持,直到服务超时。

代码:

host = new ServiceHost(typeof(XmlCacheService), new Uri(baseAddress));

host.AddServiceEndpoint(typeof(IXmlDataService), new WebHttpBinding(), string.Empty)
  .Behaviors.Add(new WebHttpBehavior());

try { xmlServiceHost.Open(); }
catch (AddressAccessDeniedException)
{
  CreateRegisterDashboardServiceFile();
  this.ShowUserInfoMessage("The dashboard service needs to be registered. Please contact support.");
}


[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]
public class XmlCacheService : IXmlDataService
{
}

[ServiceContract]
public interface IXmlDataService
{
  [WebInvoke(Method = "POST")]
  Stream GetXmlData(Stream messageBody);
}
4

4 回答 4

0

您可以使用 TPL 并等待任务完成以检查您的服务是否正在运行。

var task = Task.Factory.StartNew(() =>
                                  {
                                      _host = new ServiceHost(typeof (MyService));
                                      _host.Open();
                                  };
        task.Wait();
        CheckHostIsAvailable();

希望能帮助到你!

于 2012-10-17T14:29:57.330 回答
0

WaitHandle 呢?例如

    var host = new ServiceHost(...);
    var waitHandle = new ManualResetEvent(false);
    var serviceThread = new System.Threading.Thread(() =>
        {
            host.Open();
            waitHandle.Set();
        });
    serviceThread.Start();
    if( !waitHandle.WaitOne(MAX_TIME_TO_WAIT))
    {
        // not started...
    }
    else ..
于 2012-10-17T14:18:28.960 回答
0

一种方法是ManualResetEvent在线程之间使用 to 信号。(Thread.Sleep为了说明起见,在下面使用)。

class Program
{
    static ManualResetEvent signal = new ManualResetEvent(false);
    static void Main(string[] args)
    {
        Thread t = new Thread(_ => { Thread.Sleep(1500); Console.WriteLine("Signaling back"); signal.Set(); });
        t.Start();
        signal.WaitOne();
        Console.WriteLine("Signal received, done!");
        Console.Read();
    }
}
于 2012-10-17T14:18:39.787 回答
0

您的 WCF 主机已在单独的线程中运行。您可以为元数据创建端点以检查您的服务是否正在运行。你的合约实现中的断点呢?

class MyService
{
    var host = new ServiceHost(...);

    public MyClass()
    {
        host.Open();
    }
}

当您引用 MyService 时,您的服务将运行并且您的主线程可以执行其他任务。

于 2012-10-17T14:20:06.807 回答