[英]Background worker in selfhosted WCF Service
我对WCF和多线程是完全陌生的。 因此,我按照本教程设置了自托管的WCF服务。 右键单击“ INews_Service”接口后,单击“实现接口”。 然后,VS创建一个名为DoWork()的方法。
在上面的教程中,不需要DoWork()方法(->已删除)。 但是,在我的项目中,我想使用此方法来运行后台工作线程/任务。
在我的项目中,后台工作人员应该从外部设备永久加载数据并将其存储在DataContract类中。 反过来,WCF服务应该向外部WCF使用者同时提供该DataContract类的实例。
参考上面的教程,添加后台工作程序方法的最佳方法是什么,该方法会不断更改DataContract类的实例中的变量?
编辑:
@Brian:非常感谢! 下面的示例显示了上面教程中的自托管服务程序。 启动主机后,我想运行一个无限循环,该循环不断更新我的DataContract类。 您能举一个例子,如何做到这一点? 我不需要任何同步,例如SpinLock或Monitor?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace WCF_NewsService
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(News_Service));
host.Open();
Console.WriteLine("Host Open Sucessfully ...");
while (true)
{
//here I want to constantly update my DataContract-class TOInews
}
}
}
}
编辑2:
实际上,我的问题是我不知道如何访问在另一个文件(即在本教程中的NewsService )中定义的DataContract-object objtoinews
。 当我运行objtoinews.ID = 1;
,VS抱怨objtoinews没有在当前上下文中定义。
while (true)
{
if (host.State != CommunicationState.Opened)
{
throw new Exception("SynchronizationWS Service Host failed.");
break;
}
else
{
objtoinews.ID = 1;
objtoinews.Header = "blabla";
objtoinews.Body = "huhu";
}
}
您无需在WCF解决方案中使用DoWork。 基本上,该教程中描述的控制台程序将在调用Host.Open()时执行DoWork()。 换句话说,Host.Open()将完成您期望的DoWork()所做的事情。
控制台充当可执行文件,但是所有工作都是由WCF服务在后台异步/多线程完成的。
Booz,我不确定为什么您认为需要不断更新DataContract。 实际上,在程序运行时,我认为您不能。 如果您担心有人会向您的WS主机发送不同的数据构造,则可能需要抽象化结构,以便(基本上)您的客户端几乎可以发送任何内容。
无论如何,这是我用来循环并检查Web服务状态的代码:
while (true) {
//broken connection case
if (wshost.State != CommunicationState.Opened) {
throw new Exception("Service Host failed.");
//dump from loop and throw error
break;
}
Threading.Thread.Sleep(1000); //sleep 1 second
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.