Freigeben über


Komponenten in einer Warteschlange

Mit dem COM+-Dienst Queued Components können Komponenten auf einfache Weise mit Microsoft Message Queuing asynchron aufgerufen und ausgeführt werden. Die Verarbeitung kann ohne Rücksicht auf Verfügbarkeit oder Zugriffsmöglichkeit des Senders oder Empfängers erfolgen.

Dieser Dienst kann nur von Klassen verwendet werden, die direkt oder indirekt von der System.EnterpriseServices.ServicedComponent-Klasse abgeleitet wurden.

Durch die MaxListenerThreads-Eigenschaft wird die maximale Anzahl von gleichzeitigen Queued Components-Listenerthreads festgelegt. Der gültige Bereich dieses Wertes liegt zwischen 0 und 1000. Bei neueren Anwendungen wird die Anzahl aus dem Algorithmus abgeleitet, der gegenwärtig für die Ermittlung der Standardanzahl der Listenerthreads verwendet wird: 16 multipliziert mit der Anzahl der Server-CPUs. Durch diesen Wert wird nicht die Anzahl von Threads festgeschrieben, die ständig ausgeführt werden. Der Wert steht nur für die maximale Anzahl möglicher Threads. Auf einem Server im Leerlauf wird solange nur ein Thread ausgeführt, bis sich mehrere Nachrichten in der Warteschlange befinden. Dann werden vom Server so viele Threads erzeugt, bis der MaxListenerThreads-Wert erreicht ist. Im folgenden Beispiel wird der Wert für die maximale Anzahl von Queued Components-Listenerthreads auf 64 festgelegt.

**Hinweis   **Die für die Marshal.BindToMoniker-Methode bereitgestellte Zeichenfolge kann optionale Parameter enthalten, die den Computernamen und sonstige Informationen angeben. Weitere Informationen finden Sie im Abschnitt zur Entwicklung von Queued Components im Platform SDK.

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

Im folgenden zweiteiligen Beispiel wird gezeigt, wie auf dem Server eine QComponent-Klasse implementiert wird, mit der Nachrichten asynchron angezeigt werden. Zum Aufruf der DisplayMessage-Methode einer Queued Component wird ein Client verwendet.

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);
}

Siehe auch

Zusammenfassung verfügbarer COM+-Dienste | System.EnterpriseServices-Namespace