Извършване на асинхронни операции, Microsoft Docs

SQL Server позволява на приложенията да извършват асинхронни операции с бази данни. Асинхронната обработка позволява на методите да се връщат незабавно, без да блокират извикващата нишка. Това позволява да се използва голяма част от силата и гъвкавостта на многонишковостта, без разработчикът да трябва изрично да създава нишки или да обработва синхронизация. Приложенията изискват асинхронна обработка при инициализиране на връзка с база данни или при инициализиране на резултата от команда.

Отваряне и затваряне на връзка с база данни

Когато използвате OLE DB доставчик за SQL Server Native Client, приложенията, които могат да инициализират асинхронно обект на източник на данни, могат да зададат бита DBPROPVAL_ASYNCH_INITIALIZE на свойството DBPROP_INIT_ASYNCH, преди да извикат функциятаIDBInitialize::Initialize. Когато това свойство е зададено, доставчикът предоставя незабавно връщане от методаInitialize с резултат S_OK, ако операцията е завършила незабавно, или DB_S_ASYNCHRONOUS, ако инициализацията е продължила асинхронно. Приложенията могат да отправят запитване към интерфейсаIDBAsynchStatus или ISSAsynchStatus на обекта източник на данни и след това да извикат методаIDBAsynchStatus::GetStatus или ISSAsynchStatus::WaitForAsynchCompletion, за да получат състоянието на инициализация.

В допълнение, свойството SSPROP_ISSAsynchStatus е добавено към набора свойства DBPROPSET_SQLSERVERROWSET. Доставчиците, които поддържат интерфейсаISSAsynchStatus, трябва да внедрят това свойство със стойност VARIANT_TRUE.

ФункциитеIDBAsynchStatus::Abort и ISSAsynchStatus::Abort могат да бъдат извикани за отмяна на асинхронно извикване наInitialize. Потребителят трябва изрично да поиска инициализация на асинхронен източник на данни.В противен случай методътIDBInitialize::Initialize не се връща, докато обектът източник на данни не бъде напълно инициализиран.

Забележка

Обектите на източник на данни, използвани за групиране на връзки, не могат да извикат интерфейсаISSAsynchStatus в доставчика на OLE DB на SQL Server Native Client. ИнтерфейсътISSAsynchStatus не е наличен за обединени обекти на източник на данни.

Ако приложение изрично и принудително използва ядрото на курсора, функциитеIOpenRowset::OpenRowset иIMultipleResults::GetResult няма да поддържат асинхронна обработка.

Също така, по време на отдалечено свързване, DLL-прокси сървърът (в MDAC 2.8) не може да извика интерфейсаISSAsynchStatus в SQL Server Native Client. ИнтерфейсISSAsynchStatus не е достъпен за отдалечено управление.

Компонентите на услугата не поддържат интерфейсаISSAsynchStatus.

Изпълнение и инициализиране на набори от редове

Приложенията, способни да отварят асинхронно резултатите от изпълнението на команда, могат да задават бита DBPROPVAL_ASYNCH_INITIALIZE в свойството DBPROP_ROWSET_ASYNCH. Ако зададете този бит преди да извикатеIDBInitialize::Initialize,ICommand::Execute,IOpenRowset::OpenRowset илиIMultipleResults::GetResult, стойността на аргумента riid трябва да бъде IID_IDBAsynchStatus, IID_ISSAsynchStatus или IID_IUnknown .

Методът се връща незабавно с резултат S_OK, ако инициализацията на набор редове завърши незабавно, или с резултат DB_S_ASYNCHRONOUS, ако инициализацията на набор редове продължи асинхронно, а параметърът ppRowset указва искания интерфейс за набора редове. За доставчика на OLE DB заSQL Server Native Client, това може да бъде само интерфейсътIDBAsynchStatus илиISSAsynchStatus. Докато наборът от редове не бъде напълно инициализиран, този интерфейс действа така, сякаш е спрян и извикването на методаQueryInterface за получаване на интерфейси, различни отIID_IDBAsynchStatus илиIID_ISSAsynchStatus може да върне грешка E_NOINTERFACE. Ако потребителят не е поискал изрично асинхронна обработка, наборът от редове се инициализира синхронно. Всички заявени интерфейси са налични, когато се върне интерфейсътIDBAsynchStaus::GetStatus илиISSAsynchStatus::WaitForAsynchCompletion, което показва, че асинхронната операция е завършила. Това не означава непременно, че наборът от редове е пълен, но е пълен и напълно функционален.

Ако изпълнената команда не върне набор от редове, тя пак се връща незабавно с обект, който поддържаIDBAsynchStatus.

Ако искате да получите множество резултати от асинхронно изпълнение на команда, следвайте тези стъпки.

Задайте бита DBPROPVAL_ASYNCH_INITIALIZE на свойството DBPROP_ROWSET_ASYNCH, преди да изпълните командата.

Извикайте методаICommand::Execute и поискайте интерфейсаIMultipleResults.

ИнтерфейситеIDBAsynchStatus иISSAsynchStatus могат да бъдат получени чрез запитване към интерфейса с множество резултати с помощта на методаQueryInterface.

Когато командата завърши изпълнението, интерфейсътIMultipleResults може да се използва по нормалния начин, с единствената разлика от синхронната обработка: може да бъде върнат резултат DB_S_ASYNCHRONOUS, в който случай интерфейситеIDBAsynchStatus илиISSAsynchStatus могат да се използват за определяне дали операцията е завършила.

INВ следващия пример приложението извиква неблокиращ метод, извършва друга обработка и след това връща резултатите на процеса. ИнтерфейсътISSAsynchStatus::WaitForAsynchCompletion изчаква вътрешен обект на събитие, докато не завърши асинхронно изпълнявана операция или докато изтече времето, указано от параметъра dwMilisecTimeOut.

ИнтерфейсътISSAsynchStatus::WaitForAsynchCompletion изчаква вътрешен обект на събитие, докато не завърши асинхронно изпълнявана операция или докато не бъде подадена стойност dwMilisecTimeOut.

Следващият пример показва асинхронна обработка с множество набори от резултати.

За да предотврати блокиране, клиентът може да провери състоянието на текуща асинхронна операция, както е показано в следния пример.

Следващият пример показва как можете да отмените асинхронна операция, която се изпълнява в момента.