1

C# アプリケーションに次のコード ブロックがあります。

private bool connected 
public void ChangeStatusa()
{
     if(connected)
     {
       label1.Text="Connected"
     }else{
      label1.Text="Connected"
     }
}

SQLサーバーが切断されたときにこのコードを自動実行したいのですが、

アプリケーションのパフォーマンスに影響を与えることなく、この作業をバックグラウンドで実行したいと考えています。

基本的に、SQLサーバーの接続をチェックし、接続が失われたときにステータスを自動変更するシステムをアプリケーションに作成したいと考えています。

4

2 に答える 2

2

tcp経由で接続していますか?もしそうなら、非同期受信でストレートソケット接続を使用してみることができます: ここにいくつかのコードがあります:

class Program
{
    static bool disc = false;

    static void Main(string[] args)
    {
        dbtest dt = new dbtest();
        dt.Disconnected += new EventHandler(dt_Disconnected);
        dt.Start("10.1.32.97", 1433);

        while (!Console.KeyAvailable)
        {
            Console.WriteLine(disc?"disconnected":"tick");
            Thread.Sleep(2000);
        }

        dt.Stop();
    }

    static void dt_Disconnected(object sender, EventArgs e)
    {
        disc = true;
        Console.WriteLine("Disconnected");
    }

}

public class dbtest
{
    byte[] buffer = new byte[10];
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    public event EventHandler Disconnected = null;

    public void Start(string host, int port)
    {
        if(s!=null)
        {
            Stop();
        }

        s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        s.Connect(host, port);
        Console.WriteLine("Connected.");
        s.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallBack, s);
    }

    public void Stop()
    {
        if (s != null)
        {
            s.Close();
            s.Dispose();
            s = null;
        }
    }

    void ReceiveCallBack(IAsyncResult ar)
    {
        Socket s = ar as Socket;

        if (s != null && s.Connected)
        {
            int rcvd = s.EndReceive(ar);

            if (rcvd > 0)
            {
                s.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallBack, s);
                return;
            }
        }

        if(Disconnected!=null)
            Disconnected(this, EventArgs.Empty);
    }
}

これは基本的なことです。応答していないソケットを SQL Server が保持する期間がどれくらいかはわかりません。たぶんカウントを追加します-切断時に再接続して、実際に実際の切断などかどうかを確認します...

于 2013-09-09T21:16:59.263 に答える
0

この目的にはタイマーが機能するように思えます。スレッドスリープを伴う無限ループのバックグラウンドスレッドも機能しますが、無限ループでは何も好きではありません。

見る

C# バックグラウンド スレッド

接続を確認するための fxn は次のとおりです。

namespace answer1
{
    using System.ComponentModel;
    using System.Data.SqlClient;

    internal class ConnectionCheck
    {
        private BackgroundWorker bw = new BackgroundWorker();

        private void CheckConnection()
        {
            string connetionString = null;
            SqlConnection cnn;
            connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password";
            cnn = new SqlConnection(connetionString);
            try
            {
                cnn.Open();
                Console.WriteLine("Connection Open ! ");
                cnn.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Can not open connection ! ");
            }
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                CheckConnection();
                System.Threading.Thread.Sleep(5000);
            }
        }

        /// <summary>
        /// This is the Main routine you call to execute the background thread
        /// </summary>
        public void RunBackgroundSQLCheck()
        {
            bw.DoWork += this.bw_DoWork;
            bw.RunWorkerAsync();
        }
    }
}
于 2013-09-09T20:35:58.673 に答える