自托管WCF服务中的后台工作者

时间:2014-06-16 09:25:43

标签: c# multithreading wcf ipc

我是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";
    }
}

1 个答案:

答案 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 
 }