Mithilfe der async-Datareader
Wir sind ziemlich neu in diesem, aber wir versuchen zu nutzen, das neue async-datareader -
wir haben die Probe aus http://blogs.msdn.com/b/adonet/archive/2012/07/15/using-sqldatareader-s-new-async-methods-in-net-4-5-beta-part-2-examples.aspx
aber Probleme.
Was wir versuchen zu erreichen ist :-
Die gespeicherte Prozedur gibt 2 Tabellen, mit einem datareader, wir versuchen Sie zu füllen 2 Modelle asynchron, dh die 2 Modelle erstellt werden, zur gleichen Zeit und nicht zu warten, bis das erste Modell gebaut werden, bevor der zweite beginnen kann
(Wenn das Sinn macht?)
Unten ist das, was wir im moment haben :-
public async Task<UsertResultsModel> GetResults(string user_ID)
{
UsertResultsModel rm = new UsertResultsModel();
List<TableColumn> ltc = new List<TableColumn>();
List<List<TableColumn>> lltc = new List<List<TableColumn>>();
var col = 0;
try
{
using (SqlConnection con = new SqlConnection(Config.DatabaseStringCDA))
{
await con.OpenAsync();
SqlCommand com = new SqlCommand(@"USP_GET_USER_RESULTS", con);
com.CommandType = CommandType.StoredProcedure;
using (SqlDataReader rdr = await com.ExecuteReaderAsync())
{
col = rdr.FieldCount;
while (await rdr.ReadAsync())
{
for (int i = 0; i < rdr.FieldCount; i++)
{
string colName = rdr.GetName(i).ToSafeString();
ltc.Add(new TableColumn(colName, rdr[i].ToSafeString(), 50, EnumColumnType.String, colName));
}
lltc.Add(ltc);
}
rm.Summary = new TableViewModel { Grid = lltc };
await rdr.NextResultAsync();
lltc = new List<List<TableColumn>>();
while (rdr.Read())
{
for (int i = 0; i < rdr.FieldCount; i++)
{
string colName = rdr.GetName(i).ToSafeString();
ltc.Add(new TableColumn(colName, rdr[i].ToSafeString(), 50, EnumColumnType.String, colName));
}
lltc.Add(ltc);
}
rm.Trend = new TableViewModel { Grid = lltc };
}
}
}
catch (Exception ex)
{
log.Error(MethodBase.GetCurrentMethod(), ex);
return null;
}
await Task.WhenAll();
return rm;
//return lltc;
}
jedoch, den code schrittweise Durchlaufen, sobald wir schlagen Sie alle erwarten, Die Anwendung lädt einfach, und keine weitere code ist der hit..
Irgendwelche Tipps oder Empfehlungen für diese würde sehr geschätzt werden.
- Randnotiz:
SqlCommand
auch implementiertIDisposable
. Sie sollten auch eineusing
Erklärung dafür. - Sind Sie warten auf
GetResults
? Tutawait Task.WhenAll();
wirklich kompilieren? Was erwarten Sie, es zu tun? - Konvention, Ihre
async
Methoden sollten Suffix Async. - Ja,
await Task.WhenAll()
nicht kompilieren (es ist einparams
Methode), aber es ist so ziemlich ein no-op. - Richtig, @svick. Ich war so verdutzt zu sehen, dass der code, dass ich es vergessen habe war
params Task[]
und nicht nurTask[]
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den asynchronen Teil ist der DB I/O, was bedeutet, dass, während Sie warten auf eine offene, oder eine lese-app ist kostenlos, andere Dinge zu tun, anstatt die Blockierung bei der DB.
await/async ermöglicht es Ihnen, code zu schreiben, in einer sequentiellen Weise, obwohl Teile kann eine Weile dauern. Der code fließt genau so, wie Sie erwarten würden, in der Reihenfolge, die Zeile nach jeder
await
nicht ausgeführt, bis der ersehnte Punkt abgeschlossen ist, aber der aktuelle thread ist, schlängelte sich zurück in den stack, so dass es sich auf andere Dinge.Wenn Sie möchten, zwei Dinge gleichzeitig tun mit await/async, dann müssen Sie wickeln jedes in einer Funktion zurückgibt, die ein
Task
genauso wie traditionelle TPL. Auf diese Weise können Sie halten Sie die Aufgaben, OHNE auf die Ergebnisse, bis Sie wollen.