佇列元件
COM+ 佇列元件服務提供了一個簡單的方式,它可以使用 Microsoft Message Queuing,以非同步方式叫用 (Invoke) 和執行元件。處理時可以不必管寄件人或收件人的可用性和存取範圍。
若要使用這項服務,類別必須直接或間接從 System.EnterpriseServices.ServicedComponent 類別衍生而來。
MaxListenerThreads 屬性會指出並行佇列元件接聽項 (Listener) 執行緒的最大數目。這個值的有效範圍是 0 到 1000。對於新建立的應用程式而言,這個設定是從目前用來決定接聽項執行緒預設數目的演算法衍生而來:16 乘上伺服器中的 CPU 數。這個值並不會指出任何時間執行的執行緒數目,只會指出可能執行緒的最大數目。在閒置 (Idle) 的伺服器上,在找到更多訊息之前,佇列中只會有一個執行緒在執行。然後伺服器會依照需要建立其他執行緒,直到達到 MaxListenerThreads 值為止。下列範例會將佇列元件接聽項執行緒的最大數目設定為 64。
注意 提供給 Marshal.BindToMoniker 方法的字串可包含選擇性的參數,用來指定電腦名稱和其他資訊。如需詳細資訊,請參閱 Platform SDK 的<Developing Queued Components>一節。
<ApplicationQueuingAttribute(QueueListenerEnabled := _
true, MaxListenerThreads := 64 )>
[C#]
[ApplicationQueuingAttribute(QueueListenerEnabled = true, MaxListenerThreads = 64 )]
下列範例有兩個部分,分別說明如何在伺服器上實作 QComponent
類別以非同步顯示訊息,以及使用用戶端在佇列元件上叫用 DisplayMessage 方法。
伺服器
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");
}
}
}
用戶端
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);
}