繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM