Aracılığıyla paylaş


Eşzamanlılık

Eşzamanlılık örneği, bir hizmet örneğinin iletileri sıralı olarak mı yoksa eşzamanlı olarak mı işlediğini denetleyen numaralandırma ile kullanmayı ServiceBehaviorAttributeConcurrencyMode gösterir. Örnek, hizmet sözleşmesini uygulayan Başlarken'iICalculator temel alır. Bu örnek, ICalculatorConcurrencyhizmet eşzamanlılığının durumunu incelemek için iki ek işlem sağlayan ve öğesinden ICalculatordevralan yeni bir sözleşme 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.

Not

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 olması 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ı, tutarsızlık moduyla ilgilidir. Her PerCall ileti yeni bir hizmet örneği tarafından işlendiğinden, tutarsızlık ilgili değildir. Single Tek Single örneğin iletileri sıralı olarak mı Multiple yoksa eşzamanlı olarak mı işlediğine bağlı olarak, tutarsızlık veya eşzamanlılık önemlidir. Tutarsızlıkta PerSession , eşzamanlılık modlarından herhangi biri ilgili 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. Açıklama satırı yapılan satırları değiştirerek ve Multiple eşzamanlılık modlarıyla Single 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 tutarsızlık ile Single eşzamanlılık kullanırMultiple. İ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çin Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden 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 Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  4. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.