Служба Windows и поддержка многопоточности - PullRequest
1 голос
/ 20 января 2012

У меня есть служба Windows, которая выполняется через равные промежутки времени ... Вот фрагмент кода:

protected override void OnStart(string[] args)
{
    tickTack = new Timer(10000);
    tickTack.Elapsed += new ElapsedEventHandler(tickTack_Elapsed);
    tickTack.Start();
}

protected override void OnStop()
{
    tickTack.Stop();
}
private void tickTack_Elapsed(object sender, ElapsedEventArgs e)
{
    objProc = new Processing();
    objProc.start();
}

В моем start() методе обработки класса выполняю мою фактическую работу, как показано ниже.

public void start()
{
    try
    {
        Process_Requests();
        Process_Exports();
    }
    catch (Exception ex)
    {
        ErrorLogs.SaveError(ex, "");
    }
}

Как происходит выполнение, когда выполнение выполняется в одном потоке ??? Например, первый метод требует времени для выполнения, тогда как насчет второго метода ????

Теперь я хочу вызвать Process_request() и Preocess_export() методы. Каждый метод должен подключаться к нескольким базам данных. В этой ситуации мне нужно было бы создавать новую ветку для каждого соединения и выполнять свою работу ... Я не уверен.

public void start()
{
    try
    {
        #region 
        sqlConObjects = new List<SqlConnection>();

        // Here i am getting multiple connection strings 
        List<string> conStrings = GetConnectionStrings(); 
        foreach (string strCon in conStrings)
        {
            SqlConnection sqlCon = new SqlConnection(strCon);
            sqlConObjects.Add(sqlCon);
        }

        foreach (SqlConnection sqlCon in sqlConObjects)
        {
            //sqlCon.Open();
            Thread t = new Thread(ProcessRequest);
            t.Start((object)sqlCon);

            Thread t1=new Thread(ProcessExports);
            t1.Start((object)sqlCon);
        }
        #endregion  
    }
    catch (Exception ex)
    {
        ErrorLogs.SaveError(ex, "");
    }
}

Может кто-нибудь объяснить, как это сделать ... это тема создана или нет необходимости ??? Как должно выполняться выполнение, если мы не создаем поток для каждого объекта подключения.

1 Ответ

0 голосов
/ 20 января 2012

Таймер работает в ThreadPool из MSDN. Метод обратного вызова, выполняемый таймером, должен быть реентерабельным, поскольку он вызывается в потоках ThreadPool.Обратный вызов может выполняться одновременно в двух потоках пула потоков, если интервал таймера меньше времени, необходимого для выполнения обратного вызова, или если все потоки пула потоков используются и обратный вызов ставится в очередь несколько раз.

Такжев вашем коде вы не сохраняете ссылку на объект таймера, и он будет собран.

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

...