Asenkron Çağrı Yapma

Zaman uyumlu çağrı yapma yordamı basittir: İstemci, sunucu nesnesi üzerinde bir arabirim işaretçisi alır ve bu işaretçi aracılığıyla yöntemleri çağırır. Zaman uyumsuz çağrı bir çağrı nesnesi içerdiği için birkaç adım daha içerir.

Zaman uyumlu arabirimdeki her yöntem için, karşılık gelen zaman uyumsuz arabirim iki yöntem uygular. Bu yöntemler, senkron yöntemin adına Begin_ ve Finish_ ön eklerini ekler. Örneğin, ISimpleStream adlı bir arabirimin Read yöntemi varsa, AsyncISimpleStream arabiriminin bir Begin_Read ve Finish_Read yöntemi olur. Zaman uyumsuz bir çağrı başlatmak için istemci Begin_ yöntemini çağırır.

Asenkron bir çağrı başlatmak için

  1. ICallFactory arabirimi için sunucu nesnesini sorgular. QueryInterface E_NOINTERFACE döndürürse, sunucu nesnesi zaman uyumsuz çağrıyı desteklemez.

  2. İstediğiniz arabirime karşılık gelen bir çağrı nesnesi oluşturmak için ICallFactory::CreateCallçağırın ve ardından işaretçiyi ICallFactorybırakın.

  3. CreateCall çağrısından zaman uyumsuz arabirime yönelik bir işaretçi istemediyseniz, çağrı nesnesinden zaman uyumsuz arabirimi sorgulayın.

  4. Uygun Begin_ yöntemini çağırın.

Sunucu nesnesi artık zaman uyumsuz çağrıyı işliyor ve istemci, çağrının sonuçlarına ihtiyaç duyana kadar başka işler yapabilir.

Bir çağrı nesnesi aynı anda yalnızca bir zaman uyumsuz çağrıyı işleyebilir. Aynı veya ikinci bir istemci bekleyen bir zaman uyumsuz çağrı tamamlanmadan önce bir Begin_ yöntemi çağırırsa, Begin_ yöntemi RPC_E_CALL_PENDING döndürür.

İstemcinin Begin_ yönteminin sonuçlarına ihtiyacı yoksa, bu yordamın sonunda çağrı nesnesini serbest bırakabilir. COM bu durumu algılar ve çağrıyı temizler. Finish_ yöntemi çağrılmaz ve istemci herhangi bir parametre veya dönüş değeri almaz.

Sunucu nesnesi Begin_ yönteminden geri dönmeye hazır olduğunda, çağrı nesnesine bunun yapıldığını bildirir. İstemci hazır olduğunda, çağrı nesnesine sinyal verilip verilmediğini denetler. Bu durumda, istemci zaman uyumsuz çağrıyı tamamlayabilir.

İstemci ve sunucu arasındaki bu sinyal ve denetim mekanizması, çağrı nesnesi üzerindeki ISynchronize arabirimidir. Çağrı nesnesi normalde sistem tarafından sağlanan eşitleme nesnesini toplayarak bu arabirimi uygular. Eşitleme nesnesi, Begin_ yönteminden dönmeden hemen önce sunucunun ISynchronize::Signalçağırarak sinyal verdiği bir olay tutamacını sarmalar.

Eşzamansız bir çağrıyı tamamlamak için

  1. ISynchronize arabirimi için çağrı nesnesini sorgular.

  2. ISynchronize::Wait çağrısı.

  3. Bekle RPC_E_TIMEOUT döndürürse, Begin_ yönteminin işlenmesi tamamlanmaz. Müşteri diğer işlerle devam edebilir ve daha sonra Bekle'i yeniden çağırabilir. Wait S_OK döndürene kadar Finish_ yöntemini çağıramaz.

    Bekle S_OK döndürürse, Begin_ yöntemi döndürülür. Uygun Finish_ yöntemini çağırın.

Finish_ yöntemi istemciye çıkış parametrelerini geçirir. Finish_ yönteminin dönüş değeri de dahil olmak üzere zaman uyumsuz yöntemlerin davranışı, karşılık gelen zaman uyumlu yöntemin davranışıyla tam olarak eşleşmelidir.

İstemci, Finish_ yöntemi döner dönmez çağrı nesnesini serbest bırakabileceği gibi, ek çağrılar yapmak için çağrı nesnesine bir işaretçi tutabilir. Her iki durumda da, nesne artık gerekli olmadığında çağrı nesnesini serbest bırakmak istemcinin sorumluluğundadır.

Devam eden bir çağrı olmadığında bir Finish_ yöntemi çağırırsanız, yöntem RPC_E_CALL_COMPLETE döndürür.

Not

İstemci ve sunucu nesneleri aynı dairedeyse, ICallFactory::CreateCall çağrısının başarılı olması garanti edilmez. Sunucu nesnesi belirli bir arabirimde zaman uyumsuz çağrıyı desteklemiyorsa, çağrı nesnesi oluşturma girişimi başarısız olur ve istemcinin zaman uyumlu arabirimi kullanması gerekir.

 

Asenkron Çağrıyı İptal Etme

Zaman Uyumsuz Çağrı sırasında İstemci Güvenliğini

Kimlik Taklidi ve Asenkron Çağrılar