我需要在我的客户端应用程序中托管服务,以便将数据暴露给也嵌入在我的客户端中的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);
}
答案 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();
希望它有所帮助!