Yöntem Çağrılarını İptal Etme

Dağıtılmış ve Web tabanlı uygulamaların kullanıma sunulmasıyla, bazı yöntem çağrılarının döndürülmesi kabul edilemez kadar uzun sürebilir. Ağ bağlantısının gecikme süresi yüksek olabilir, sunucu makinesi birçok istemciye hizmet ediyor olabilir veya sunucu bileşeni multimedya dosyası gibi büyük miktarda veri geçiriyor olabilir. Kullanıcıların çok uzun süren bir isteği iptal edebilmesi ve uygulamanın iptal isteklerini işleyip diğer çalışmalarına devam edebilmesi gerekir. COM'da, tek iş parçacıklı bir daireden kaynaklanan bekleyen bir çağrıyı iptal etmek için IMessageFilter arabirimini kullanabilirsiniz.

Bir çağrı sıralandığında, ara sunucu ICancelMethodCalls arabirimini uygulayan bir cancel nesnesi oluşturur. cancel nesnesi hem çağrı hem de çağrının beklemede olduğu iş parçacığıyla ilişkilendirilir.

Bekleyen çağrıyı iptal etmek için istemci, çağrının iptal edildiğini sunucu nesnesine bildirme ayrıntılarını işleyen iptal nesnesi üzerinden bir iptal isteği geçirir. Çağrılan yöntem döndürülmediyse, sunucu nesnesi iptal isteğini algılarken ayırdığı tüm program kaynaklarını temizler ve uygun bir HRESULT değeri döndürerek çağrının yürütülmesini iptal ettiğini bildirir. Çağrılan yöntem zaten döndürdüyse, cancel nesnesi istemciye bildirir. Her iki durumda da istemci iş parçacığının engeli kaldırılır ve işlemeye devam edebilir.

Sunucu nesnesinin iptal isteğine nasıl yanıt verdiği sunucu uygulayıcısının takdirine bağlıdır, ancak istemci tarafındaki çağrı dizisi her zaman engellenmez ve sunucunun ona iletmeye çalıştığı sonuçları görmezden gelir. Nesneleri iptal etme, şu anda çalışan bir yöntemin iptal edilmesi için bir yöntem sağlar, ancak sunucu nesnesinin çağrıyı işlemeyi durduracağının garantisi yoktur. Örneğin, çağrı zaten döndürmüş olabilir veya sunucu nesnesi iptal nesnelerini desteklemiyor olabilir.

COM, standart hazırlama kullanan istemci nesneleri ve arabirimleri için iptal nesnelerinin standart bir uygulamasını otomatik olarak sağlar. Özel hazırlama kullanan nesneler ve arabirimler için kendi iptal nesnenizi uygulamanız gerekir.

Şu anda, iptal nesneleri yalnızca zaman uyumlu çağrıları işler.

Asenkron Çağrıyı İptal Etme

CoGetCancelObject

CoSetCancelObject

CoTestCancel