2016-07-15 8 views
0

Ich habe einige Verbindungen wie folgt aus:Wie kann ich parallel für das Laden von Seiten verwenden?

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 und arbeiten, um. Ich brauche diese Verbindungen parallel laufen. Wie kann ich das machen?

+0

Gebrauch 2 x Task.Run, 1 für CON1 und 2 für con2 –

+0

(Off topic) Beachten Sie, dass es auch Oracle-spezifische Verbindungsklassen (usw.), die mehr/bessere Funktionalität im Vergleich zu generischem OleDb kann anbieten Klassen. –

+0

@phe: Konnten Sie das lösen? – bwyn

Antwort

1

Mit C# 6 und .NET 4.5 fertig sind, können Sie die TPL mit async verwenden und den Code sieht sogar Reiniger:

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 Ich würde mit genau dem gleichen Code antworten. Nur meine Variablen haben unterschiedliche Namen. Ein starkes Anzeichen dafür, dass dies "der Weg" ist;) –

+0

Großartige Köpfe denken gleich :) –

0

starten CON1 und CON2 asynchron und warten, bis beide Aufgaben

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

Mit 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; 
     } 
    }