Консольное приложение C #, медленно для выхода - PullRequest
2 голосов
/ 04 мая 2011

У меня есть очень простое консольное приложение C #, которое подключается к БД, выполняет запрос, закрывает соединение и выходит из приложения.

Проблема в том, что приложению требуется почти 3 секунды для выхода.

Я отображал время на каждом шаге, чтобы понять, почему он работает медленно, а не во время какой-либо обработки, а только когда он выходит из приложения.

Кто-нибудьзнаете, как ускорить это?

Вот вывод:

Разрывное соединение: 94мс
26: ОК
Закрывающее соединение: 356мс
Закрытое соединение: 357мс
Выход: 358 мс
[Задержка около 3 секунд до выхода]

А вот код:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;

namespace CheckSQL
{
    class Program
    {
        static Stopwatch watch = new Stopwatch();

        static void Main(string[] args)
        {
            if (args.Length == 0) return;
            watch.Start();

            string connstring = args[0];
            string sqlquery = args[1];

            ExecuteScalar(connstring, sqlquery);
            watch.Stop();
            Console.WriteLine(string.Format("Exiting:{0}ms", watch.ElapsedMilliseconds));
        }

        private static void ExecuteScalar(string connstring, string sqlquery)
        {
            SqlConnection sqlconn = new SqlConnection(connstring);
            SqlCommand sqlcmd = new SqlCommand(sqlquery, sqlconn);

            try
            {
                Console.WriteLine(string.Format("Opening Connection:{0}ms", watch.ElapsedMilliseconds));
                sqlconn.Open();
                Console.WriteLine(string.Format("{0}:OK", sqlcmd.ExecuteScalar()));
            }
            catch (Exception ex)
            {
                Console.WriteLine(string.Format("0:{0}", ex.Message));
            }
            finally
            {
                if (sqlconn.State == ConnectionState.Open)
                {
                    Console.WriteLine(string.Format("Closing Connection:{0}ms", watch.ElapsedMilliseconds));
                    sqlconn.Close();
                    Console.WriteLine(string.Format("Closed Connection:{0}ms", watch.ElapsedMilliseconds));
                }
            }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 29 ноября 2013

У меня была похожая проблема с консольным приложением C #, и я обнаружил, что проблема связана с очисткой пула соединений при выходе из приложения.С подключениями в пуле я измерил задержку на выход в 1.6 секунды (приурочен к внешнему сценарию, вызывающему мой EXE).Хотя я не был полностью доволен решением, я обнаружил, что выдача следующего перед выходом убрала задержку:

System.Data.SqlClient.SqlConnection.ClearAllPools ();

Я быугадайте, что при использовании «Pooling = False» в ваших соединениях тоже получится ... Но вы сделаете это, только если вам не нужны преимущества объединения.

1 голос
/ 04 мая 2011

Закрытие соединения (вызов sqlconn.Close()) означает только возврат его в ConnectionPool.

Так что еще есть некоторая уборка на выходе.

3 секунды кажутся довольно длинными, но здесь есть несколько компонентов (CLR, база данных).

0 голосов
/ 05 мая 2011

Я думаю, что это невозможно сделать правильно. Как вы можете найти работу, которая занимает некоторое время? Единственно возможный способ в этом случае - оптимизировать алгоритм, но вы не можете этого сделать. Как я понимаю, вы должны вернуть контроль сразу же после проверки некоторой информации базы данных. Вы можете обойти это, создав две системы процессов. Первый процесс запускается вторым, а второй, в свою очередь, проверяет информацию в базе данных и отправляет результаты первому процессу, который связывается с пользователем. Таким образом, вы всегда вернете контроль после получения результатов. Второй процесс может занять некоторое время, но этот факт не должен беспокоить вас, потому что к этому моменту у вас будет контроль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...