客户端内的自托管服务线程

时间:2012-10-17 14:12:59

标签: c# web-services

我需要在我的客户端应用程序中托管服务,以便将数据暴露给也嵌入在我的客户端中的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 个答案:

答案 0 :(得分:0)

WaitHandle怎么样? e.g。

    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 ..

答案 1 :(得分:0)

一种方法是使用ManualResetEvent在线程之间发出信号。 (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();
    }
}

答案 2 :(得分:0)

您的WCF主机已经在一个单独的线程中运行。您可以为元数据创建端点,以检查您的服务是否正在运行。合同实施中的断点怎么样?

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

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

虽然您有对MyService的引用,但您的服务将正在运行,您的主线程可以执行其他任务。

答案 3 :(得分:0)

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

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

希望它有所帮助!