Silverlight 4.0 WCF-RIA服务中OPC客户端的单实例

Silverlight 4.0 WCF-RIA服务中OPC客户端的单实例,silverlight-4.0,wcf-ria-services,silverlight-5.0,opc,Silverlight 4.0,Wcf Ria Services,Silverlight 5.0,Opc,我正在开发一个简单的Silverlight应用程序。该应用程序将显示OPC服务器标签中的信息,该服务器运行在web服务器的同一台机器上 我使用一个方法实现了一个域服务类,该方法允许客户端请求标记的值。问题是,每次我从客户端调用该方法时,它都会实例化一个新的OPC客户端,连接到服务器,读取值,然后断开连接。这可能是大量呼叫的问题 如何在服务器端使用单个OPC客户端对象 下面是域服务类的代码 namespace BFLabClientSL.Web.Servizi { using System

我正在开发一个简单的Silverlight应用程序。该应用程序将显示OPC服务器标签中的信息,该服务器运行在web服务器的同一台机器上

我使用一个方法实现了一个域服务类,该方法允许客户端请求标记的值。问题是,每次我从客户端调用该方法时,它都会实例化一个新的OPC客户端,连接到服务器,读取值,然后断开连接。这可能是大量呼叫的问题

如何在服务器端使用单个OPC客户端对象

下面是域服务类的代码

namespace BFLabClientSL.Web.Servizi
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;
    using OpcClientX;
    using System.Configuration;

    // TODO: creare metodi contenenti la logica dell'applicazione.
    [EnableClientAccess()]
    public class DSCAccessoDati : DomainService
    {
        protected OPCItem itemOPC = null;

        /// <summary>
        /// Permette l'acceso al valore di un dato
        /// </summary>
        /// <param name="itemCode">Chiave del dato</param>
        /// <returns>Valore del dato</returns>
        public string GetDato(string itemCode)
        {
            string result = "";

            OPCServer clientOPC = new OPCServer();
            clientOPC.Connect(Properties.Settings.Default.OPCServer_ProgID);
            OPCGroup gruppoOPC = clientOPC.OPCGroups.Add("Gruppo1");

            OPCItem itemOPC = gruppoOPC.OPCItems.AddItem(itemCode, 0);

            try
            {
                object value = null;
                object quality = null;
                object timestamp = null;

                itemOPC.Read(1, out value, out quality, out timestamp);

                result = (string)value;
            }
            catch (Exception e)
            {
                throw new Exception("Errore durante Caricamento dato da OPCServer", e);
            }
            finally
            {
                try
                {
                    clientOPC.Disconnect();
                }
                catch { }
                clientOPC = null;
            }

            return result;
        }
    }
}
命名空间bLabClientSL.Web.Servizi
{
使用制度;
使用System.Collections.Generic;
使用系统组件模型;
使用System.ComponentModel.DataAnnotations;
使用System.Linq;
使用System.ServiceModel.DomainServices.Hosting;
使用System.ServiceModel.DomainServices.Server;
使用OpcClientX;
使用系统配置;
//TODO:creare metodi Contention la logica dell’Applicatione。
[EnableClientAccess()]
公共类DSAccessodati:DomainService
{
受保护的OPCItem itempc=null;
/// 
///达托瓦洛雷酒店
/// 
///奇瓦德尔达托酒店
///达托谷酒店
公共字符串GetDato(字符串项代码)
{
字符串结果=”;
OPCServer clientOPC=新的OPCServer();
Connect(Properties.Settings.Default.OPCServer_ProgID);
opcgroupgruppoop=clientOPC.OPCGroups.Add(“Gruppo1”);
OPCItem itempc=grupboopc.OPCItems.AddItem(itemCode,0);
尝试
{
对象值=空;
对象质量=空;
对象时间戳=空;
读取(1,输出值,输出质量,输出时间戳);
结果=(字符串)值;
}
捕获(例外e)
{
抛出新异常(“Errore durante Caricamento dato da OPCServer”,e);
}
最后
{
尝试
{
clientOPC.Disconnect();
}
捕获{}
clientOPC=null;
}
返回结果;
}
}
}

一个简单的解决方案是在类中定义一个静态变量OPCServer,初始化一次并在方法中重用它

public class DSCAccessoDati : DomainService
{
    private static OPCServer clientOPC;

    static DSCAccessoDati() {
      clientOPC = new OPCServer();
      clientOPC.Connect(Properties.Settings.Default.OPCServer_ProgID);
    }

    public string GetDato(string itemCode) {

      OPCGroup gruppoOPC = clientOPC.OPCGroups.Add("Gruppo1");
      //your code without the disconnect of OPCServer
    }