Zaman Uyumlu ve Zaman Uyumsuz İşlemler

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

Birçok uygulama, yöntem çağrısı çalışırken uygulamanın faydalı işler yapmaya devam etmesini sağladığı için yöntemleri zaman uyumsuz olarak çağırır. Windows Communication Foundation (WCF) hizmetleri ve istemcileri, WCF uygulamalarının aktarım hızını etkileşimle dengeliyerek en üst düzeye çıkarmak için daha fazla esneklik sağlayan uygulamanın iki farklı seviyesinde 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, eşzamanlı bir ileti değişimi kullanarak eşzamanlı olmayan 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 Asenkron 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, BeginOperationTwo() içinden bir BeginOperationOne() çağrısı yapın.

  • 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 tetiklenir ve birden fazla iş parçacığını kendiniz işlemek zorunda kalmadan uygulamanın cevap verme hızını artırır.

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

Asenkron Hizmet İşlemi Uygulaması

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

  1. Görev tabanlı asenkron model

  2. Eşzamansız olay tabanlı model

  3. IAsyncResult zaman uyumsuz deseni

Görev Tabanlı Zaman Uyumsuz Desen

Görev tabanlı zaman uyumsuz desen, en kolay ve en anlaşılır 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ı Asenkron Örüntü

Olay Tabanlı Zaman Uyumsuz Deseni destekleyen bir hizmetin MethodNameAsync adlı bir veya daha fazla işlemi olacaktır. Bu yöntemler, aynı iş parçacığında aynı işlemi gerçekleştiren eşzamanlı 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 tanımlandığı 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 şekilde gerçekleştirilebilir ve <Begin> metodunun AsyncPattern özelliği true olarak ayarlanarak işaretlenebilir. 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 mesaj alışverişi gerçekleştiği sürece bu modeli senkron veya asenkron işlem olarak temsil edebilirler.

Genel olarak, sistemlerin zaman uyumsuz doğası nedeniyle, alt iş parçacıklarına bağımlı olmamalı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:

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

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

  • Yöntemi, EndOperation ve IAsyncResult parametreleri ile out parametresini içerir ve ref işlem 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 BeginDoWork yöntemine 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 şekilde çağırmak için System.IAsyncResult nesnelerini kullanmanız 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 bir yöntem olarak modellendiği ve <Begin> özelliği AsyncPattern olarak ayarlanmış, true yöntemi ve buna karşılık gelen <End> yöntemi içeren bir hizmet sözleşmesi oluşturur. 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, bağıntılı yanıtı olmayan tek yönlü işlemlerin istemciden veya hizmetten bağımsız olarak her iki yönde de gönderilebildiği bir eşzamansız ileti değişim deseni oluşturabilirsiniz. (Bu, tek yönlü iletilerle çift yönlü ileti değişimi desenini kullanır.) Bu durumda, hizmet sözleşmesi tek yönlü bir ileti değişimini belirtir ve her iki taraf da bunu, uygun olduğunda zaman uyumsuz çağrılar veya uygulamalar olarak uygulayabilir ya da uygulamayabilir. 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 Bazlı Asenkron İ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 Result nesnesi üzerinde EventArgs özelliği olarak döndüren bir imza oluşturur. Tüm iç dönüş değerleri daha sonra yanıt iletisi nesnesinin özellikleridir.

Ayrıca bkz.