Componenti in coda

Il servizio Componenti in coda di COM+ rappresenta una semplice soluzione per richiamare ed eseguire i componenti in modo asincrono tramite i servizi di accodamento messaggi Microsoft. È possibile eseguire l'elaborazione indipendentemente dalla disponibilità o dall'accessibilità del mittente o del ricevente.

Per utilizzare il servizio, è necessario che la classe derivi direttamente o indirettamente dalla classe System.EnterpriseServices.ServicedComponent.

La proprietà MaxListenerThreads indica il numero massimo di thread listener dei componenti in coda che è possibile eseguire contemporaneamente. I valori validi sono compresi tra 0 e 1000. Per una nuova applicazione, l'impostazione è derivata dall'algoritmo corrente utilizzato per determinare il numero predefinito dei thread listener: 16 moltiplicato per il numero di CPU del server. Il valore non indica il numero di thread in esecuzione in qualsiasi momento, ma solo il numero massimo di thread possibili. Su un server inattivo, ad esempio, può essere in esecuzione un solo thread finché non vengono rilevati più messaggi in coda. In questo caso, il server crea altri thread finché non viene raggiunto il valore MaxListenerThreads. Nell'esempio che segue, il numero massimo di thread listener dei componenti in coda viene impostato su 64.

**Nota   **La stringa fornita al metodo Marshal.BindToMoniker può contenere parametri aggiuntivi che specifichino il nome del computer e altre informazioni. Per ulteriori informazioni, vedere la sezione "Developing Queued Components" della documentazione relativa a Platform SDK.

<ApplicationQueuingAttribute(QueueListenerEnabled := _ 
true, MaxListenerThreads :=  64 )>
[C#]
[ApplicationQueuingAttribute(QueueListenerEnabled = true, MaxListenerThreads =  64 )]

Nell'esempio in due parti che segue viene illustrato come implementare su un server una classe QComponent per la visualizzazione asincrona di un messaggio e come utilizzare un client per richiamare il metodo DisplayMessage in un componente in coda.

Server

Imports System.Reflection
Imports System.EnterpriseServices
Imports System

<assembly: ApplicationName("QCDemoSvr")>
<assembly: ApplicationActivation(ActivationOption.Server)>
<assembly: ApplicationQueuing(Enabled := True, _
            QueueListenerEnabled := True)>
<assembly: AssemblyKeyFile("QCDemoSvr.snk")>

Namespace QCDemo
   Public Interface IQComponent
      Sub DisplayMessage(msg As String)
   End Interface 
   
   <InterfaceQueuing(Interface := "IQComponent")> _
   Public Class QComponent 
   Inherits ServicedComponent Implements IQComponent 
          Public Sub DisplayMessage(msg As String) implements _
          IQComponent.DisplayMessage
             MessageBox.Show(msg, "Processing message")
          End Sub 'DisplayMessage
   End Class 
End Namespace 
[C#]
using System.Reflection;
using System.EnterpriseServices;

[assembly: ApplicationName("QCDemoSvr")]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationQueuing(Enabled=true, QueueListenerEnabled=true)]
[assembly: AssemblyKeyFile("QCDemoSvr.snk")]

namespace QCDemo
{
    public interface IQComponent 
    {
        void DisplayMessage(string msg);
    }

 [InterfaceQueuing(Interface = "IQComponent"]
    public class QComponent  : ServicedComponent, IQComponent
    {
        public void DisplayMessage(string msg)
        {
            MessageBox.Show(msg, "Processing message");
        }
    }
} 

Client

Protected Sub Send_Click(sender As Object, e As System.EventArgs) _
Handles send.Click
      Dim iQc As IQComponent = Nothing
      Try
            iQc = CType(Marshal.BindToMoniker("queue:/new:QCDemo.QComponent"), _
            IQComponent)
      Catch l as Exception
            Console.Writeline("Caught Exception: " & l.Message)
      End Try
      iQc.DisplayMessage(messageToSend.Text)
      Marshal.ReleaseComObject(iQc)
End Sub 'Send_Click
[C#]
protected void Send_Click (object sender, System.EventArgs e)
{
      IQComponent iQc = null;
      try
      {
            iQc = (IQComponent)      Marshal.BindToMoniker("queue:/new:QCDemo.QComponent");
      }
      catch
      {
            MessageBox.Show("Cannot create Queued Component");
      }
      iQc.DisplayMessage (messageToSend.Text);
      Marshal.ReleaseComObject(iQc);
}

Vedere anche

Riepilogo dei servizi COM+ disponibili | Spazio dei nomi System.EnterpriseServices