2016-07-15 3 views
0

У меня есть несколько соединений, как это:Как использовать параллельное соединение для загрузки страницы?

try 
{ 
OleDbConnection con1; 
using (con1 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db1:1521;Persist Security Info=True;Password=password;User ID=username")) 
{ 
    con1.Open(); 
    v1 = 1; 
    con1.Close(); 
} 
} 
catch (Exception ex) 
{ 
v1 = 0; 
} 

try 
{ 
OleDbConnection con2; 
using (con2 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db2:1521;Persist Security Info=True;Password=password;User ID=username")) 
{ 
    con2.Open(); 
    v2 = 1; 
    con2.Close(); 
} 
} 
catch (Exception ex) 
{ 
v2 = 0; 
} 

In Page_Load и работающие в порядке. Мне нужно параллельное выполнение этих соединений. Как я могу это сделать?

+0

использование 2 х Task.Run, 1 для con1 и 2 для con2 –

+0

(Off темы) Обратите внимание, что также Oracle-специфические классы подключения (и т.д.), что может предложить больше/лучшую функциональность, по сравнению с общей OleDb классы. –

+0

@phe: Вы могли решить это? – bwyn

ответ

1

С C# 6 и .NET 4.5 вы можете использовать TPL с асинхронном и код выглядит даже очиститель:

static void Main() 
{ 
    var v1Task = Connect(); 
    var v2Task = Connect(); 

    var results = Task.WhenAll(v1Task, v2Task); 

    var v1 = results.Result[0]; 
    var v2 = results.Result[1]; 
} 

static async Task<int> Connect() 
{ 
    int v; 

    try 
    { 
     using (var con2 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db2:1521;Persist Security Info=True;Password=password;User ID=username")) 
     { 
      await con2.OpenAsync(); 
      v = 1; 
      con2.Close(); 
     } 
    } 
    catch (Exception) 
    { 
     v = 0; 
    } 

    return v; 
} 
+1

+1 Я собирался ответить ТОЧНО одним и тем же кодом. Только мои переменные имеют разные имена. Сильное указание на то, что это «путь»;) –

+0

Великие мысли думают одинаково :) –

0

Start con1 и CON2 асинхронно и ждать, пока обе задачи не закончены

var task1 = Task.Run(() => 
{ 
    try 
    { 
     using (OleDbConnection con1 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db1:1521;Persist Security Info=True;Password=password;User ID=username")) 
     { 
      con1.Open(); 
      v1 = 1; 
      con1.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     v1 = 0; 
    } 
}); 
var task2 = Task.Run(() => 
{ 
    try 
    { 
     using (OleDbConnection con2 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db2:1521;Persist Security Info=True;Password=password;User ID=username")) 
     { 
      con2.Open(); 
      v2 = 1; 
      con2.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     v2 = 0; 
    } 
}); 

// If you need to wait until task1 and task2 finished, then use this: 
List<Task> tasks = new List<Task>(); 
tasks.Add(task1); 
tasks.Add(task2); 
Task.WaitAll(tasks.ToArray()); 
0

Использование Parallel.For:

static void Main(string[] args) 
    { 
     ConcurrentDictionary<string, int> results = new ConcurrentDictionary<string, int>(); 
     string[] connStrings = new string[]{"connstring1", "connstring2"}; 
     Parallel.For(0, connStrings.Length, (i) => { 
      results[connStrings[i]] = TryToConnectToDatabase(connStrings[i]); 
     }); 
    } 

    static int TryToConnectToDatabase(string connstr) 
    { 
     try 
     { 
      OleDbConnection con1; 
      using (con1 = new OleDbConnection(connstr)) 
      { 
       con1.Open(); 
       con1.Close(); 
       return 1; 
      } 
     } 
     catch (Exception ex) 
     { 
      return 0; 
     } 
    } 
Смежные вопросы