есть метод в пространстве имен ZennoLab.OwnCode как его заблокировать для потоков?

tanaris

Client
Регистрация
07.01.2019
Сообщения
29
Благодарностей
2
Баллы
3
Собственно вот метод он содержится в пространстве имен ZennoLab.OwnCode
C#:
public class DB
    {
        private string hostname;
        private string username;
        private string password;
        private string database;
        private string timeout;
        private string charset;
        private string result;
        private MySqlConnection conn;
       
       
        public DB(string db_hostname, string db_username, string db_password, string db_database, string db_timeout, string db_charset="utf8"){
            hostname = db_hostname;
            username = db_username;
            password = db_password;
            database = db_database;
            timeout = db_timeout;
            charset = db_charset;
            result = String.Empty;
            string db_port =  "3306";
           
            var m = db_hostname.Split(':');
            if ( m.Length == 2 ){
                db_hostname = m[0];
                db_port = m[1];
            }
           
            var connectionString = "server="+db_hostname+";user="+db_username+";database="+db_database+";port="+db_port+";password="+db_password+";defaultcommandtimeout="+db_timeout+";pooling=False;";
            conn = new MySqlConnection(connectionString);

            open();
        }

       
        public void open(){
            conn.Open();
        }      

       
        public void close(){
            conn.Close();  
        }      
       
        public void query(string query){
            MySqlCommand command = new MySqlCommand(query, conn);
            command.ExecuteNonQuery();
        }
       
        public List<string> getAll(string query, string fieldSeparator="|"){
           
            var result = new List<string>();

            MySqlCommand command = new MySqlCommand(query, conn);          
           
            MySqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                List<string> fields = new List<string>();
                for(int i=0; i<reader.FieldCount; i++)
                fields.Add(reader[i].ToString());
               
                result.Add(string.Join(fieldSeparator,fields));
               
            }
            reader.Close();
           
            return result;          
        }

        public List<string> getRow(string query){

            MySqlCommand command = new MySqlCommand(query, conn);          
           
            MySqlDataReader reader = command.ExecuteReader();
           
            if ( reader.Read() ){
       
                List<string> result = new List<string>();
                for(int i=0; i<reader.FieldCount; i++)
                result.Add(reader[i].ToString());

                reader.Close();
                return result;              
            }
           
            reader.Close();
            return new List<string>();          
        }
       
       
        public string getOne(string query){
             MySqlCommand command = new MySqlCommand(query, conn);
            string result = "";
            try { result = command.ExecuteScalar().ToString(); } catch{}
            return result;
        }
       
       
        public string escapeString(string text){          
            return MySql.Data.MySqlClient.MySqlHelper.EscapeString(text);
        }
    }
КАК его заблокировать для других потоков пока не выполню свой запрос к базе данных?
 

tanaris

Client
Регистрация
07.01.2019
Сообщения
29
Благодарностей
2
Баллы
3
не знаю где почитать информацию по этому вопросу поэтому тут спрашиваю, весь форум забит вопросами по спискам, таблицам и прочему ненужному дерьму, извиняюсь за выражение, для настоящей работы
 
Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Добавить в свой класс объект для блокировки, и использовать стандартную конструкцию lock.
C#:
lock(lockObj)
{
// синхронизируемые операторы
}
Такой объект для примера создается по умолчанию в owncode.
61857


 

tanaris

Client
Регистрация
07.01.2019
Сообщения
29
Благодарностей
2
Баллы
3
а не могли бы вы мне простой строчкой написать что нужно добавить, и куда добавить?? я полный ноль в этом вопросе)
 
Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Добавляем объект для блокировки.
private static object _lock = new object();

61863


И дальше нужное место оборачиваем в lock. Например так.
C#:
public List<string> getRow(string query)
{
    lock (_lock)
    {
        MySqlCommand command = new MySqlCommand(query, conn);

        MySqlDataReader reader = command.ExecuteReader();

        if (reader.Read())
        {

            List<string> result = new List<string>();
            for (int i = 0; i < reader.FieldCount; i++)
                result.Add(reader[i].ToString());

            reader.Close();
            return result;
        }

        reader.Close();
        return new List<string>();
    }
}
Смысл в том, что когда будут создаваться объекты класс DB в разных потоках, если шаб запущен в многопоток, и затем вызываться метод getRow,
то именно это место будет выполняться по очереди. Те если один поток уже работает с этим куском кода, то другие будут ждать.

Плюс надо понимать, что не надо все и вся блочить, тк если запущено +100500 потоков, и код в lock выполняется долго, то это может стать узким местом.
 

tanaris

Client
Регистрация
07.01.2019
Сообщения
29
Благодарностей
2
Баллы
3
братан Moadip ты сделал мой день, теперь все корректно работает, но остается один поток который не завершается, и висит в постере, почему?
может какую то проверку выполнения транзакции добавить? Именно последняя не срабатывает.
 
Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
братан Moadip ты сделал мой день, теперь все корректно работает, но остается один поток который не завершается, и висит в постере, почему?
может какую то проверку выполнения транзакции добавить? Именно последняя не срабатывает.
Братан @tanaris рад что помог.:D
Почему виснет именно последний запрос, можно долго гадать. Тут только дебажить.
Я бы сделал как. Взял отдельную бд, с небольшим кол-вом записей, и в свой класс, который у тебя DB, в конструктор еще бы передавал project.
Это чтобы изнутри этого класса можно было писать в лог.
И далее, после каждого запроса(как вариант еще и перед) писал мессаги в лог.
Таким макаром можно будет выявить где косяк. А потом уже думать в чем причина.

PS: конструктор, это вот это, те в него надо добавить еще один параметр - project.
public DB(string db_hostname, string db_username, string db_password, string db_database, string db_timeout, string db_charset="utf8", IZennoPosterProjectModel project)
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)