Zaman Uyumlu ve Zaman Uyumsuz İşlemler

Bu konu başlığında zaman uyumsuz hizmet işlemlerini uygulama ve çağırma ele alınmaktadır.

Yöntem çağrısı çalıştırılırken uygulamanın yararlı işler yapmaya devam etmelerine olanak sağladığından birçok uygulama yöntemleri zaman uyumsuz olarak çağırır. Windows Communication Foundation (WCF) hizmetleri ve istemcileri, wcf uygulamalarının etkileşime karşı dengeli aktarım hızını en üst düzeye çıkarmak için daha da fazla esneklik sağlayan uygulamanın iki farklı düzeyinde zaman uyumsuz işlem çağrılarına katılabilir.

Zaman Uyumsuz İşlem Türleri

WCF'deki tüm hizmet sözleşmeleri, parametre türleri ve dönüş değerleri ne olursa olsun, istemci ve hizmet arasında belirli bir ileti değişimi deseni belirtmek için WCF özniteliklerini kullanır. WCF, gelen ve giden iletileri otomatik olarak uygun hizmet işlemine veya çalışan istemci koduna yönlendirir.

İstemci yalnızca belirli bir işlem için ileti değişimi düzenini belirten hizmet sözleşmesine sahiptir. İstemciler, temel alınan ileti değişimi düzeni gözlemlendiği sürece geliştiriciye seçtikleri programlama modelini sunabilir. Bu nedenle, belirtilen ileti düzeni gözlemlendiği sürece hizmetler de işlemleri herhangi bir şekilde uygulayabilir.

Hizmet sözleşmesinin hizmetten veya istemci uygulamasından bağımsızlığı, WCF uygulamalarında aşağıdaki zaman uyumsuz yürütme biçimlerini etkinleştirir:

  • İstemciler, zaman uyumlu bir ileti değişimi kullanarak istek/yanıt işlemlerini zaman uyumsuz olarak çağırabilir.

  • Hizmetler, zaman uyumlu bir ileti değişimi kullanarak zaman uyumsuz olarak bir istek/yanıt işlemi uygulayabilir.

  • İleti değişimleri, istemcinin veya hizmetin uygulanmasından bağımsız olarak tek yönlü olabilir.

Önerilen Zaman Uyumsuz Senaryolar

İşlem hizmeti uygulaması G/Ç çalışması yapma gibi bir engelleme çağrısı yaparsa, hizmet işlemi uygulamasında zaman uyumsuz bir yaklaşım kullanın. Zaman uyumsuz bir işlem uygulamasındayken, zaman uyumsuz çağrı yolunu mümkün olduğunca genişletmek için zaman uyumsuz işlemleri ve yöntemleri çağırmayı deneyin. Örneğin, içinden bir BeginOperationTwo() çağrısı gerçekleştirin BeginOperationOne().

  • Aşağıdaki durumlarda istemcide veya çağıran uygulamada zaman uyumsuz bir yaklaşım kullanın:

  • İşlemleri orta katman bir uygulamadan çağırıyorsanız. (Bu tür senaryolar hakkında daha fazla bilgi için bkz. Orta Katman İstemci Uygulamaları.)

  • bir ASP.NET sayfasında işlemleri çağırıyorsanız, zaman uyumsuz sayfalar kullanın.

  • Windows Forms veya Windows Presentation Foundation (WPF) gibi tek iş parçacıklı herhangi bir uygulamadan işlemleri çağırıyorsanız. Olay tabanlı zaman uyumsuz çağrı modeli kullanılırken, sonuç olayı kullanıcı arabirimi iş parçacığında oluşturulur ve birden çok iş parçacığını kendiniz işlemeniz gerekmeden uygulamaya yanıt hızı eklenir.

  • Genel olarak, zaman uyumlu ve zaman uyumsuz çağrı arasında bir seçeneğiniz varsa, zaman uyumsuz çağrıyı seçin.

Zaman Uyumsuz Hizmet İşlemi Uygulama

Zaman uyumsuz işlemler aşağıdaki üç yöntemden biri kullanılarak uygulanabilir:

  1. Görev tabanlı zaman uyumsuz desen

  2. Olay tabanlı zaman uyumsuz desen

  3. IAsyncResult zaman uyumsuz deseni

Görev Tabanlı Zaman Uyumsuz Desen

Görev tabanlı zaman uyumsuz desen, en kolay ve en düz işlem olduğundan zaman uyumsuz işlemleri uygulamak için tercih edilen yoldur. Bu yöntemi kullanmak için yalnızca hizmet işleminizi uygulayın ve T görevinin<> dönüş türünü belirtin. Burada T, mantıksal işlem tarafından döndürülen türdür. Örneğin:

public class SampleService:ISampleService
{
   // ...  
   public async Task<string> SampleMethodTaskAsync(string msg)
   {
      return Task<string>.Factory.StartNew(() =>
      {
         return msg;
      });
   }  
   // ...  
}  

SampleMethodTaskAsync işlemi, mantıksal işlem bir dize döndürdüğünden Görev<dizesini> döndürür. Görev tabanlı zaman uyumsuz desen hakkında daha fazla bilgi için bkz . Görev Tabanlı Zaman Uyumsuz Desen.

Uyarı

Görev tabanlı zaman uyumsuz desen kullanılırken, işlemin tamamlanması beklenirken bir özel durum oluşursa T:System.AggregateException oluşturulabilir. Bu özel durum istemcide veya hizmetlerde oluşabilir

Olay Tabanlı Zaman Uyumsuz Desen

Olay Tabanlı Zaman Uyumsuz Deseni destekleyen bir hizmetin MethodNameAsync adlı bir veya daha fazla işlemi olacaktır. Bu yöntemler, geçerli iş parçacığında aynı işlemi gerçekleştiren zaman uyumlu sürümleri yansıtabilir. Sınıfın bir MethodNameCompleted olayı da olabilir ve methodNameAsyncCancel (veya yalnızca CancelAsync) yöntemi olabilir. İşlemi çağırmak isteyen bir istemci, işlem tamamlandığında çağrılacak bir olay işleyicisi tanımlar.

Aşağıdaki kod parçacığında, olay tabanlı zaman uyumsuz desen kullanılarak zaman uyumsuz işlemlerin nasıl bildir alındığı gösterilmektedir.

public class AsyncExample  
{  
    // Synchronous methods.  
    public int Method1(string param);  
    public void Method2(double param);  
  
    // Asynchronous methods.  
    public void Method1Async(string param);  
    public void Method1Async(string param, object userState);  
    public event Method1CompletedEventHandler Method1Completed;  
  
    public void Method2Async(double param);  
    public void Method2Async(double param, object userState);  
    public event Method2CompletedEventHandler Method2Completed;  
  
    public void CancelAsync(object userState);  
  
    public bool IsBusy { get; }  
  
    // Class implementation not shown.  
}  

Olay Tabanlı Zaman Uyumsuz Desen hakkında daha fazla bilgi için bkz . Olay Tabanlı Zaman Uyumsuz Desen.

IAsyncResult Zaman Uyumsuz Deseni

Bir hizmet işlemi, .NET Framework zaman uyumsuz programlama deseni kullanılarak zaman uyumsuz bir şekilde uygulanabilir ve yöntemi özelliği olarak trueayarlanmış olarak AsyncPattern işaretlenebilir<Begin>. Bu durumda, zaman uyumsuz işlem zaman uyumlu bir işlemle aynı biçimde meta verilerde kullanıma sunulur: İstek iletisi ve bağıntılı yanıt iletisi ile tek bir işlem olarak kullanıma sunulur. Daha sonra istemci programlama modellerinin bir seçeneği vardır. Hizmet çağrıldığında bir istek-yanıt iletisi değişimi gerçekleştiği sürece bu düzeni zaman uyumlu bir işlem veya zaman uyumsuz bir işlem olarak temsil edebilir.

Genel olarak, sistemlerin zaman uyumsuz doğasıyla, iş parçacıklarına bağımlılık almamalısınız. Verileri işlem gönderme işleminin çeşitli aşamalarına geçirmenin en güvenilir yolu uzantıları kullanmaktır.

Bir örnek için bkz . Nasıl yapılır: Zaman Uyumsuz Hizmet İşlemi Uygulama.

İstemci uygulamasında nasıl çağrıldıklarından bağımsız olarak zaman uyumsuz olarak yürütülen bir sözleşme işlemi X tanımlamak için:

  • ve EndOperationdesenini BeginOperation kullanarak iki yöntem tanımlayın.

  • yöntemi, BeginOperation işlemin ve ref parametrelerini içerir in ve bir IAsyncResult tür döndürür.

  • yöntemi, EndOperation ve parametrelerinin out yanı sıra bir IAsyncResult parametre de içerir ve işlem ref dönüş türünü döndürür.

Örneğin, aşağıdaki yönteme bakın.

int DoWork(string data, ref string inout, out string outonly)  
Function DoWork(ByVal data As String, ByRef inout As String, _out outonly As out) As Integer  

Zaman uyumsuz bir işlem oluşturmak için iki yöntem şöyle olabilir:

[OperationContract(AsyncPattern=true)]
IAsyncResult BeginDoWork(string data,
                         ref string inout,
                         AsyncCallback callback,
                         object state);
int EndDoWork(ref string inout, out string outonly, IAsyncResult result);  
<OperationContract(AsyncPattern := True)>
Function BeginDoWork(ByVal data As String, _
                     ByRef inout As String, _
                     ByVal callback As AsyncCallback, _
                     ByVal state As Object) As IAsyncResult
Function EndDoWork(ByRef inout As String, ByRef outonly As String, ByVal result As IAsyncResult) As Integer  

Not

OperationContractAttribute özniteliği yalnızca yöntemine BeginDoWork uygulanır. Sonuçta elde edilen sözleşmede adlı DoWorkbir WSDL işlemi vardır.

İstemci Tarafı Zaman Uyumsuz Çağırmalar

WCF istemci uygulaması daha önce açıklanan üç zaman uyumsuz çağrı modelinden herhangi birini kullanabilir

Görev tabanlı modeli kullanırken, aşağıdaki kod parçacığında gösterildiği gibi await anahtar sözcüğünü kullanarak işlemi çağırmanız yeterlidir.

await simpleServiceClient.SampleMethodTaskAsync("hello, world");  

Olay tabanlı zaman uyumsuz desenin kullanılması yalnızca yanıtın bildirimini almak için bir olay işleyicisi eklenmesini gerektirir ve sonuçta elde edilen olay kullanıcı arabirimi iş parçacığında otomatik olarak oluşturulur. Bu yaklaşımı kullanmak için, aşağıdaki örnekte olduğu gibi ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) ile hem /asynchem de /tcv:Version35 komut seçeneklerini belirtin.

svcutil http://localhost:8000/servicemodelsamples/service/mex /async /tcv:Version35  

Bu işlem tamamlandığında, Svcutil.exe çağıran uygulamanın yanıtı almak ve uygun eylemi gerçekleştirmek için bir olay işleyicisi uygulayıp atamasını sağlayan olay altyapısına sahip bir WCF istemci sınıfı oluşturur. Tam bir örnek için bkz . Nasıl yapılır: Hizmet İşlemlerini Zaman Uyumsuz Olarak Çağırma.

Ancak olay tabanlı zaman uyumsuz model yalnızca .NET Framework 3.5'te kullanılabilir. Ayrıca, bir WCF istemci kanalı kullanılarak System.ServiceModel.ChannelFactory<TChannel>oluşturulduğunda .NET Framework 3.5'te bile desteklenmez. WCF istemci kanalı nesneleriyle, işlemlerinizi zaman uyumsuz olarak çağırmak için nesneleri kullanmanız System.IAsyncResult gerekir. Bu yaklaşımı kullanmak için, aşağıdaki örnekte olduğu gibi ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) ile /async komut seçeneğini belirtin.

svcutil http://localhost:8000/servicemodelsamples/service/mex /async

Bu, her işlemin özelliği ve buna karşılık gelen <End> bir yöntem olarak ayarlanmış bir <Begin> yöntem AsyncPattern olarak modellendiği true bir hizmet sözleşmesi oluşturur. kullanarak tam bir ChannelFactory<TChannel>örnek için bkz . Nasıl yapılır: Channel Factory Kullanarak İşlemleri Zaman Uyumsuz Olarak Çağırma.

Her iki durumda da, bir uygulama yerel zaman uyumlu bir yöntemi zaman uyumsuz olarak çağırmak için aynı deseni kullanabildiği gibi, hizmet zaman uyumlu olarak uygulansa bile uygulamalar bir işlemi zaman uyumsuz olarak çağırabilir. İşlemin nasıl uygulandığı istemci için önemli değildir; yanıt iletisi geldiğinde, içeriği istemcinin zaman uyumsuz <End> yöntemine gönderilir ve istemci bilgileri alır.

Tek Yönlü İleti Değişimi Desenleri

Ayrıca, tek yönlü işlemlerin (bağıntılı yanıtı olmayan işlemler OperationContractAttribute.IsOneWaytrue ) istemci veya hizmet tarafından diğer taraftan bağımsız olarak her iki yönde de gönderilebileceği zaman uyumsuz bir ileti değişimi deseni oluşturabilirsiniz. (Bu, tek yönlü iletilerle çift yönlü ileti değişimi desenini kullanır.) Bu durumda hizmet sözleşmesi, her iki tarafın da zaman uyumsuz çağrılar veya uygulamalar olarak uygulayabileceği ya da uygun olmayan tek yönlü bir ileti değişimini belirtir. Genellikle, sözleşme tek yönlü iletilerin değişimi olduğunda, uygulama büyük ölçüde zaman uyumsuz olabilir çünkü bir ileti gönderildikten sonra uygulama yanıt beklemez ve başka işler yapmaya devam edebilir.

Olay Tabanlı Zaman Uyumsuz İstemciler ve İleti Sözleşmeleri

Olay tabanlı zaman uyumsuz model durumu için tasarım yönergeleri, birden fazla değer döndürülürse bir değerin Result özellik olarak döndürüldüğünü ve diğerlerinin nesnede EventArgs özellik olarak döndürüldüğünü belirtir. Bunun bir sonucu, istemcinin olay tabanlı zaman uyumsuz komut seçeneklerini kullanarak meta verileri içeri aktarması ve işlemin birden fazla değer döndürmesi durumunda varsayılan EventArgs nesnenin özellik olarak Result bir değer döndürmesi ve kalan nesnenin EventArgs özellikleri olmasıdır.

İleti nesnesini özellik olarak Result almak ve döndürülen değerleri bu nesnede özellik olarak kullanmak istiyorsanız , /messageContract komut seçeneğini kullanın. Bu, yanıt iletisini nesne üzerinde EventArgs özelliği olarak Result döndüren bir imza oluşturur. Tüm iç dönüş değerleri daha sonra yanıt iletisi nesnesinin özellikleridir.

Ayrıca bkz.