Der er en specifik adfærd for Microsoft SQLDependency-klassen. Selvom du kalder SqlDependency.Stop()-metoden, skal du frigive SqlCommand og SqlConnection - den holder stadig samtalegrupper (sys.conversation_groups) og samtaleendepunkter (sys.conversation_endpoints) i databasen. Det ser ud til, at SQL Server indlæser alle konversationsslutpunkter og bruger al tilladt hukommelse. Her test, der beviser det. Så for at rense alle ubrugte samtaleendepunkter og frigive al optaget hukommelse, skal du starte denne SQL-kode til din database:
DECLARE @ConvHandle uniqueidentifier
DECLARE Conv CURSOR FOR
SELECT CEP.conversation_handle FROM sys.conversation_endpoints CEP
WHERE CEP.state = 'DI' or CEP.state = 'CD'
OPEN Conv;
FETCH NEXT FROM Conv INTO @ConvHandle;
WHILE (@@FETCH_STATUS = 0) BEGIN
END CONVERSATION @ConvHandle WITH CLEANUP;
FETCH NEXT FROM Conv INTO @ConvHandle;
END
CLOSE Conv;
DEALLOCATE Conv;
SqlDependency giver dig heller ikke mulighed for at modtage ALLE ændringer af tabellen. Så du modtager ikke besked om ændringer under SqlDependency-gentilmelding.
For at undgå alle disse problemer havde jeg brugt en anden open source-realisering af SqlDependency-klassen - SqlDependencyEx . Den bruger databaseudløser og indbygget Service Broker-meddelelse til at modtage hændelser om ændringer af tabellen. Dette er et brugseksempel:
int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME))
{
sqlDependency.TableChanged += (o, e) => changesReceived++;
sqlDependency.Start();
// Make table changes.
MakeTableInsertDeleteChanges(changesCount);
// Wait a little bit to receive all changes.
Thread.Sleep(1000);
}
Assert.AreEqual(changesCount, changesReceived);
Håber dette hjælper.