我是WCF和多线程的新手。因此,我按照this tutorial设置了自主WCF服务。在我右键单击接口“INews_Service”后,我点击了“实现接口”。然后,VS创建一个名为DoWork()的方法。
在上面的教程中,不需要DoWork()方法( - >它被删除)。但是,在我的项目中,我想使用此方法来运行后台工作线程/任务。
在我的项目中,后台工作程序应该从外部设备永久加载数据并将其存储在DataContract类中。反过来,WCF服务应该同时向外部WCF使用者提供该DataContract类的实例。
参考上面的教程,添加后台工作方法的最佳方法是什么,后者会不断更改DataContract类实例中的变量?
修改
@Brian:非常感谢!以下示例显示了上面的tutuorial中的自主服务程序。在我启动主机之后,我想运行一个无限循环,不断更新我的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
}
}
}
}
EDIT2:
实际上,我的问题是我不知道如何访问我的DataContract-object objtoinews
,它在另一个文件中定义(即在 NewsService 中,如教程中所示) 。当我运行类似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";
}
}
答案 0 :(得分:0)
您无需在WCF解决方案中使用DoWork。基本上,当调用Host.Open()时,该tutoral中描述的控制台程序将执行DoWork()。换句话说,Host.Open()将执行您期望的DoWork()将执行的操作。
控制台充当可执行文件,但所有工作都是由WCF服务在后台异步/多线程完成的。
Booz,我不确定为什么你认为你需要不断更新你的DataContract。实际上,当程序运行时,我认为你不能。如果您担心人们向您的WS主机发送不同的数据结构,可能您需要抽象结构,以便(基本上)您的客户端几乎可以发送任何内容。无论如何,这是我用来循环和检查我的网络服务状态的代码:
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
}