Синхронизация всего класса к потокам - C#

Узнай цену своей работы

Формулировка задачи:

Привет! В моем коде есть 2 потока, первый поток подключается к базе, вот код:
namespace LoginServer.network.mysql.MysqlConnector
{
    class MysqlConnector
    {
        public static MySqlConnection mysqlConnect = null;
        public static string Connect;
        public static int mysqlconnected;
 
        //Connect to mysql
        public static bool mysqlconnect(string server, string user, string database, string port, string password)
        {
                Connect = "server=" + server + ";user=" + user + ";database=" + database + ";port=" + port + ";password=" + password + ";";
                MySqlConnection mysqlConnect = new MySqlConnection(Connect);
 
                try
                {
                    mysqlConnect.Open();
                    ConsoleUtilities.consoleinfo("SUCCESSFULLY CONNECTED TO DB");
                    mysqlconnected = 1;
                    return true;
                }
                catch (Exception)
                {
                    ConsoleUtilities.consolerror("ERROR WHEN CONNECT TO DB");
                    return false;
                }
        }
 
        //Close Mysql Connection
 
        public static bool mysqlclose()
        {
                try
                {
                    mysqlConnect.Close();
                    ConsoleUtilities.consoleinfo("DB CLOSED");
                    return true;
                }
                catch (Exception)
                {
                    ConsoleUtilities.consolerror("ERROR WHEN CLOSE DB");
                    return false;
                }
        }
    
    }
}
Но есть второй поток, который вызывает MysqlConnector.mysqlclose(), но не может, так как первый поток использует этот класс как подключение и постоянно занимает его собой, как мне синхронизировать весь класс, чтобы первый поток мог вызывать mysqlconnect(), а второй mysqlclose() Заранее спасибо!

Решение задачи: «Синхронизация всего класса к потокам»

textual
Листинг программы
using System.Threading;
 
namespace xcv
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Семафор 1 - под главный поток, всего - 2
            sema = new Semaphore(1, 2);
            //Создаем поток для класса конектора
            th = new Thread(new ThreadStart(delegate 
                {
                    //Для избежания неправильных межпотоковых вызовов
                    sc = new SynchronizationContext();
                    //Создаем класс коннектора в отдельном потоке
                    conn = new Connector();
                    //Суспендим
                    Thread.Sleep(Timeout.Infinite);
                }));
            //Запускаем
            th.Start();
         
        }
        //поток с конектором
        Thread th;
        private void button1_Click(object sender, EventArgs e)
        {
            
            //Первый поток
            ((AsyncCallback)delegate
            {
                while (true)
                {
                    //Занимаем семафор или ждём пока освободиться
                    sema.WaitOne();
                    //Обращаемся к коннектору в его потоке
                    sc.Send(delegate { conn.Connect(); }, null);
                    //Типа делаем своё дело
                    Thread.Sleep(1200);
                    //Дисконектимся
                    sc.Send(delegate { conn.Disconnect(); }, null);
                    //Освобождаем Семафор
                    sema.Release();
                }
            }).BeginInvoke(null, null, null);
 
            //Второй поток, тут тоже самое что и выше.
            ((AsyncCallback)delegate
            {
                while (true)
                {
                    sema.WaitOne();
                    sc.Send(delegate { conn.Connect(); }, null);
                    Thread.Sleep(1700);
                    sc.Send(delegate { conn.Disconnect(); }, null);
                    sema.Release();
                }
            }).BeginInvoke(null, null, null);
 
 
        }
        
        SynchronizationContext sc;
        Semaphore sema;
        Connector conn;
        class Connector
        {
            bool Connected = false;
            public void Connect()
            {
                //Вот тут критические секцие уже не нужны, потому что семафорим доступ,
                //однако если семафоры убрать - будет вылетать ошибка... 
                Thread.BeginCriticalRegion(); 
                if (Connected) throw new Exception("Double connect!");
                Connected = true;
                Thread.EndCriticalRegion();
                Thread.Sleep(2000);
            }
            public void Disconnect()
            {
                Thread.EndCriticalRegion();
                if (!Connected) throw new Exception("Double disconnect");
                Connected = false;
                Thread.EndCriticalRegion();
                Thread.Sleep(2500);
            }
        }
 
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.643 из 5
Похожие ответы