Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az aszinkron műveletek ADO.NET lehetővé teszik, hogy időigényes adatbázis-műveleteket kezdeményezhessenek egy szálon, miközben más feladatokat hajtanak végre egy másik szálon. A legtöbb esetben azonban végül el fog érni egy olyan pontot, ahol az alkalmazás nem folytathatja a működését, amíg az adatbázis-művelet be nem fejeződik. Ilyen esetekben érdemes lekérdezni az aszinkron műveletet annak megállapításához, hogy a művelet befejeződött-e vagy sem.
A tulajdonság segítségével IsCompleted megállapíthatja, hogy a művelet befejeződött-e.
Example
Az alábbi konzolalkalmazás aszinkron módon frissíti az AdventureWorks-mintaadatbázis adatait. Egy hosszú ideig futó folyamat emulálásához ez a példa beszúr egy WAITFOR utasítást a parancsszövegbe. Általában nem próbálja meg lassabban futtatni a parancsokat, de ebben az esetben megkönnyíti az aszinkron viselkedés bemutatását.
using System;
using System.Data;
using Microsoft.Data.SqlClient;
class Class1
{
[STAThread]
static void Main()
{
// The WAITFOR statement simply adds enough time to
// prove the asynchronous nature of the command.
string commandText =
"UPDATE Production.Product SET ReorderPoint = " +
"ReorderPoint + 1 " +
"WHERE ReorderPoint Is Not Null;" +
"WAITFOR DELAY '0:0:3';" +
"UPDATE Production.Product SET ReorderPoint = " +
"ReorderPoint - 1 " +
"WHERE ReorderPoint Is Not Null";
RunCommandAsynchronously(
commandText, GetConnectionString());
Console.WriteLine("Press Enter to continue.");
Console.ReadLine();
}
private static void RunCommandAsynchronously(
string commandText, string connectionString)
{
// Given command text and connection string, asynchronously
// execute the specified command against the connection.
// For this example, the code displays an indicator as it's
// working, verifying the asynchronous behavior.
using (SqlConnection connection =
new SqlConnection(connectionString))
{
try
{
int count = 0;
SqlCommand command =
new SqlCommand(commandText, connection);
connection.Open();
IAsyncResult result =
command.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
Console.WriteLine(
"Waiting ({0})", count++);
// Wait for 1/10 second, so the counter
// doesn't consume all available
// resources on the main thread.
System.Threading.Thread.Sleep(100);
}
Console.WriteLine(
"Command complete. Affected {0} rows.",
command.EndExecuteNonQuery(result));
}
catch (SqlException ex)
{
Console.WriteLine("Error ({0}): {1}",
ex.Number, ex.Message);
}
catch (InvalidOperationException ex)
{
Console.WriteLine("Error: {0}", ex.Message);
}
catch (Exception ex)
{
// You might want to pass these errors
// back out to the caller.
Console.WriteLine("Error: {0}", ex.Message);
}
}
}
private static string GetConnectionString()
{
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
// If you have not included "Asynchronous Processing=true"
// in the connection string, the command will not be able
// to execute asynchronously.
return "Data Source=(local);Integrated Security=SSPI;" +
"Initial Catalog=AdventureWorks; " +
"Asynchronous Processing=true";
}
}