I've the next construction:

            Parallel.ForEach(Program.config.Root.Elements("databases"), el =>
            {
                try
                {                   
                DBConnection.OpenConnection(el.Attribute("database_alias").Value);
                }
                catch (Exception exc)
                {
                    WriteLog(10, exc);
                }
            });

This construction employed for initial opening database connections. But by reason of third party component iterations may dangles on whole application. Therefore we improve contruction and customize the one:

            Parallel.ForEach(Program.config.Root.Elements("databases"), el =>
            {
                try
                {
                    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(DBConnection.OpenConnection));
                    t.Start(el.Attribute("database_alias").Value);

                    // Handling 50 seconds timeout
                    if (!t.Join(50000))
                    {
                        t.Abort();
                        // Force closing because connection is hanging with "connecting" state
                        Program.myConnections[el.Attribute("database_alias").Value].Conn.Close();                                                     
                    }                        
                }
                catch (Exception exc)
                {
                    WriteLog(10, exc);
                }
            });

But even we now have alive threads over time. I can tell them counting amount in task manager. Does anybody understands how to manage by using it? Thanks ahead of time!

If Thread.Abort is not working, then your threads are most likely hung in native code. Really, aborting a thread is generally a very bad idea anyway. Unless of course you are unloading an AppDomain.

So that is what I'd try next: start the threads inside a temporary AppDomain and unload it after your 50 sec test.

In the event that does not work, you will need to move these to a brief process.

Your code is sort of hard to understand, so please try to refactor it:

System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(DBConnection.OpenConnection));
t.Start(el.Attribute("database_alias").Value);

// Handling 50 seconds timeout
if (!t.Join(50000))
{
    t.Abort();
    // Force closing because connection is hanging with "connecting" state
    Program.myConnections[el.Attribute("database_alias").Value].Conn.Close();                                                     
}

Try seeing if this can be done rather:

Thread t = new Thread(()=>
{
    try
    {
        // I'm not sure what the correct call is for OpenConnection, but the code below
        // seems appropriate. If it's not right, then do it the right way
        DBConnection.OpenConnection(el.Attribute("database_alias").Value);
    }
    catch(ThreadInterruptedException tie)
    {
        // Eat the exception or do something else (i.e. cleanup or whatever)
    }
});
t.IsBackground = true;
t.Start();

// Handling 50 seconds timeout
if (!t.Join(50000))
{
    // Interrupt the exception instead of aborting it (this should get you out of blocking states)
    t.Interrupt();

    // Force closing because connection is hanging with "connecting" state
    Program.myConnections[el.Attribute("database_alias").Value].Conn.Close();                                                     
}