Aracılığıyla paylaş


Eşzamanlılık

Eşzamanlılık örneği, bir hizmet örneğinin iletileri sıralı veya eşzamanlı olarak işleyip işlemeyeceğini kontrol eden ServiceBehaviorAttribute numaralandırmasını ConcurrencyMode ile kullanmayı gösterir. Örnek, hizmet sözleşmesini uygulayan ICalculator temel alınarak oluşturulmuştur. Bu örnek, ICalculatorConcurrency öğesinden devralarak, hizmet eşzamanlılığı durumunu incelemek için iki ek işlem sağlayan yeni bir sözleşme olan ICalculator tanımlar. Eşzamanlılık ayarını değiştirerek, istemciyi çalıştırarak davranıştaki değişikliği gözlemleyebilirsiniz.

Bu örnekte, istemci bir konsol uygulamasıdır (.exe) ve hizmet Internet Information Services (IIS) tarafından barındırılır.

Uyarı

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Üç eşzamanlılık modu vardır:

  • Single: Her hizmet örneği bir kerede bir iletiyi işler. Bu varsayılan eşzamanlılık modudur.

  • Multiple: Her hizmet örneği birden çok iletiyi eşzamanlı olarak işler. Bu eşzamanlılık modunu kullanmak için hizmet uygulamasının iş parçacığı güvenliğini sağlaması gerekir.

  • Reentrant: Her hizmet örneği bir kerede bir iletiyi işler, ancak yeniden gelen çağrıları kabul eder. Hizmet yalnızca çağrı yaparken bu çağrıları kabul eder. Reentrant, ConcurrencyMode.Reentrant örneğinde gösterilmiştir .

Eşzamanlılık kullanımı, örnekleme moduyla ilgilidir. Her PerCall mesaj yeni bir hizmet örneği tarafından işlendiğinden, eşzamanlılık önemli değildir. Single örneklemede, tek bir örneğin iletileri sırayla mı yoksa eşzamanlı mı işlediğine bağlı olarak, Single veya Multiple eşzamanlılık önemlidir. PerSession örneklemede, eşzamanlılık modlarından herhangi biri relevant olabilir.

Hizmet sınıfı, aşağıdaki kod örneğinde gösterildiği gibi özniteliğiyle [ServiceBehavior(ConcurrencyMode=<setting>)] eşzamanlılık davranışını belirtir. Hangi satırların açıklama satırı yapıldığını değiştirerek Single ve Multiple eşzamanlılık modlarıyla denemeler yapabilirsiniz. Eşzamanlılık modunu değiştirdikten sonra hizmeti yeniden derlemeyi unutmayın.

// Single allows a single message to be processed sequentially by each service instance.
//[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]

// Multiple allows concurrent processing of multiple messages by a service instance.
// The service implementation should be thread-safe. This can be used to increase throughput.
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]

// Uses Thread.Sleep to vary the execution time of each operation.
public class CalculatorService : ICalculatorConcurrency
{
    int operationCount;

    public double Add(double n1, double n2)
    {
        operationCount++;
        System.Threading.Thread.Sleep(180);
        return n1 + n2;
    }

    public double Subtract(double n1, double n2)
    {
        operationCount++;
        System.Threading.Thread.Sleep(100);
        return n1 - n2;
    }

    public double Multiply(double n1, double n2)
    {
        operationCount++;
        System.Threading.Thread.Sleep(150);
        return n1 * n2;
    }

    public double Divide(double n1, double n2)
    {
        operationCount++;
        System.Threading.Thread.Sleep(120);
        return n1 / n2;
    }

    public string GetConcurrencyMode()
    {
        // Return the ConcurrencyMode of the service.
        ServiceHost host = (ServiceHost)OperationContext.Current.Host;
        ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
        return behavior.ConcurrencyMode.ToString();
    }

    public int GetOperationCount()
    {
        // Return the number of operations.
        return operationCount;
    }
}

Örnek varsayılan olarak Multiple eşzamanlılık ve Single örnekleme kullanır. İstemci kodu, zaman uyumsuz bir ara sunucu kullanacak şekilde değiştirildi. Bu, istemcinin her çağrı arasında bir yanıt beklemeden hizmete birden çok çağrı yapmasını sağlar. Hizmet eşzamanlılık modunun davranışındaki farkı gözlemleyebilirsiniz.

Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. Hizmetin altında çalıştığı eşzamanlılık modu görüntülenir, her işlem çağrılır ve işlem sayısı görüntülenir. Eşzamanlılık modu olduğunda Multiple, hizmet birden çok iletiyi eşzamanlı olarak işlediğinden sonuçların çağrılmalarından farklı bir sırada döndürüldüğünü fark edin. Hizmet her iletiyi sırayla işlediğinden eşzamanlılık modu Singleolarak değiştirilerek sonuçlar çağrıldıkları sırayla döndürülür. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  2. Ara sunucu istemcisini oluşturmak için Svcutil.exe kullanıyorsanız, seçeneğini eklediğinizden /async emin olun.

  3. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.

  4. Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.