0

シンプルな Silverlight アプリを開発しています。アプリケーションは、Web サーバーの同じマシンで実行されている OPC サーバーのタグで見つかった情報を表示します。

クライアントがタグの値を要求できるようにするメソッドを使用して、ドメイン サービス クラスを実装しました。問題は、クライアント側からメソッドを呼び出すたびに、新しい OPC クライアントをインスタンス化し、サーバーに接続し、値を読み取ってから切断することです。これは、多数の呼び出しで問題になる可能性があります。

サーバー側で単一の OPC Client オブジェクトを使用するにはどうすればよいですか?

これがドメイン サービス クラスのコードです。

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;
        }
    }
}
4

1 に答える 1

0

簡単な解決策は、一度初期化し、メソッドで再利用するクラスで静的変数 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
    }
于 2013-01-31T07:36:51.633 に答える