@Sushkov
">alert("yohoho")

Как подружить БД, StreamReader с потоком?

Дело вот в чем в методе, который вызывает поток я обращаюсь к файлу и выполняю SQL запрос. И со временем память очень загружается. Первая проблема это с работой с большим фалом и получением нужной строки. Вообщем я пробовал StreamReader openfile вынести за пределы метода, но почему-то программа останавливается просто не доходя до конца файла и не выскакивает никаких ошибок.
А второе это работа с БД. Приходится каждый раз подключаться, открывать соединение и закрывать его.
Можно ли тут как-то оптимизировать?
string query = String.Format(@"SELECT server,port,ssl FROM imap WHERE host = '{0}'", _login[1]);
                SqlConnection sqlConnection = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\mailgraber.mdf;Integrated Security=True");
                SqlCommand cmd = new SqlCommand(); //sql запрос
                SqlDataReader reader;
                sqlConnection.Open();
                cmd.CommandText = query;
                cmd.CommandType = CommandType.Text;
                cmd.Connection = sqlConnection;
                reader = cmd.ExecuteReader();


private void Start()
        {
            StreamReader openfile = new StreamReader(openFileDialog.FileName);
            while (true)
            {
                int current; string temp = null;

                lock (block)
                {
                    if (now < count)
                    {
                        current = now;

                        for (int i = 0; i <= current; i++)//работа с файлом лучшего способа не нашел.
                        {
                            //openfile.BaseStream.Seek(offset, SeekOrigin.Begin);
                            temp = openfile.ReadLine();
                            // offset += temp.Length+1;
                            // openfile.Dispose();
                        }
                        now++;
                    }
                    else return;
                }

                string login = null, pass = null;
                string[] _login = null;
                try
                {
                    login = temp.Split(delimiter.Text[0])[0];
                    pass = temp.Split(delimiter.Text[0])[1];
                    _login = login.Split('@');
                }
                catch { continue; }

                string hostname = null; int port = 993; bool ssl = true;

                string query = String.Format(@"SELECT server,port,ssl FROM imap WHERE host = '{0}'", _login[1]);
                SqlConnection sqlConnection = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\mailgraber.mdf;Integrated Security=True");
                SqlCommand cmd = new SqlCommand(); //sql запрос
                SqlDataReader reader;
                sqlConnection.Open();
                cmd.CommandText = query;
                cmd.CommandType = CommandType.Text;
                cmd.Connection = sqlConnection;
                reader = cmd.ExecuteReader();
                
                ....
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 2
@VanKrock
Ну сразу бросается в глаза, что вы не освобождаете стрим, этот как минимум потенциальная ошибка утечки памяти.

StreamReader openfile = new StreamReader(openFileDialog.FileName);


я бы заменил на
using (var openfile = new StreamReader(openFileDialog.FileName))


дальше, вы открыли файл и выполняете операции над ним в вечном цикле - это тоже потенциально опасно утечкой памяти, по мне лучше открыть файл, что-то с ним сделать и закрыть, то есть сделайте OpenFileDialog над объявлением, а создание стрима уже внутри.

SqlConnection и SqlCommand если не ошибаюсь тоже IDisposable их тоже следует обернуть в using, как и StreamReader - Ошибка с утечкой памяти скорей всего здесь.

И еще момент, я бы не стал делать цикл while(true), обычно я делаю private переменную _needStop и цикл while(!_needStop). Это для того, чтобы если понадобится, написать метод Stop()

Upd: немного посмотрел код ( используйте лучше FileStream вместо с StreamReader. Вот даже статью нашел metanit.com/sharp/tutorial/5.4.php FileStream вы хотя бы будете знать что там у вас с кодировками, а то всякое бывает.) хотя я в этом и не так уж уверен и со мной можно поспорить.
Ответ написан
Комментировать
1) Что бы не читать весь файл целиком сразу используйте File.ReadLines.
2) Что бы коннект держался дольше используйте pooling=true; Свойство SqlConnection.ConnectionString
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы