MessageQueue.BeginReceive Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Zahájí asynchronní operaci příjmu tím, že službě Řízení front zpráv oznámíte, že začne přijímat zprávu, a upozorní obslužnou rutinu události po dokončení.
Přetížení
| Name | Description |
|---|---|
| BeginReceive() |
Inicializuje asynchronní operaci příjmu, která nemá časový limit. Operace není dokončena, dokud se ve frontě nezobrazí zpráva. |
| BeginReceive(TimeSpan) |
Inicializuje asynchronní operaci příjmu, která má zadaný časový limit. Operace se nedokončuje, dokud se ve frontě nezobrazí zpráva nebo dojde k vypršení časového limitu. |
| BeginReceive(TimeSpan, Object) |
Inicializuje asynchronní operaci příjmu, která má zadaný časový limit a zadaný stav objekt, který poskytuje přidružené informace po celou dobu životnosti operace. Operace se nedokončuje, dokud se ve frontě nezobrazí zpráva nebo dojde k vypršení časového limitu. |
| BeginReceive(TimeSpan, Object, AsyncCallback) |
Inicializuje asynchronní operaci příjmu, která má zadaný časový limit a zadaný stav objekt, který poskytuje přidružené informace po celou dobu životnosti operace. Toto přetížení obdrží oznámení prostřednictvím zpětného volání identity obslužné rutiny události pro operaci. Operace se nedokončuje, dokud se ve frontě nezobrazí zpráva nebo dojde k vypršení časového limitu. |
| BeginReceive(TimeSpan, Cursor, Object, AsyncCallback) |
Iniciuje asynchronní operaci příjmu, která má zadaný časový limit a používá zadaný kurzor a zadaný stav objekt. Objekt stavu poskytuje přidružené informace po celou dobu životnosti operace. Toto přetížení obdrží oznámení prostřednictvím zpětného volání identity obslužné rutiny události pro operaci. Operace se nedokončuje, dokud se ve frontě nezobrazí zpráva nebo dojde k vypršení časového limitu. |
BeginReceive()
Inicializuje asynchronní operaci příjmu, která nemá časový limit. Operace není dokončena, dokud se ve frontě nezobrazí zpráva.
public:
IAsyncResult ^ BeginReceive();
public IAsyncResult BeginReceive();
member this.BeginReceive : unit -> IAsyncResult
Public Function BeginReceive () As IAsyncResult
Návraty
Ten IAsyncResult identifikuje publikovaný asynchronní požadavek.
Výjimky
Při přístupu k metodě řízení front zpráv došlo k chybě.
Příklady
Následující příklad kódu zřetědí asynchronní požadavky. Předpokládá se, že v místním počítači existuje fronta s názvem "myQueue". Funkce Main zahájí asynchronní operaci, která je zpracována rutinou MyReceiveCompleted .
MyReceiveCompleted zpracuje aktuální zprávu a zahájí novou asynchronní operaci příjmu.
#using <system.dll>
#using <system.messaging.dll>
using namespace System;
using namespace System::Messaging;
using namespace System::Threading;
ref class MyNewQueue
{
public:
// Define static class members.
static ManualResetEvent^ signal = gcnew ManualResetEvent( false );
static int count = 0;
// Provides an event handler for the ReceiveCompleted
// event.
static void MyReceiveCompleted( Object^ source, ReceiveCompletedEventArgs^ asyncResult )
{
try
{
// Connect to the queue.
MessageQueue^ mq = dynamic_cast<MessageQueue^>(source);
// End the asynchronous receive operation.
mq->EndReceive( asyncResult->AsyncResult );
count += 1;
if ( count == 10 )
{
signal->Set();
}
// Restart the asynchronous receive operation.
mq->BeginReceive();
}
catch ( MessageQueueException^ )
{
// Handle sources of MessageQueueException.
}
// Handle other exceptions.
return;
}
};
// Provides an entry point into the application.
//
// This example performs asynchronous receive
// operation processing.
int main()
{
// Create an instance of MessageQueue. Set its formatter.
MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );
array<Type^>^p = gcnew array<Type^>(1);
p[ 0 ] = String::typeid;
myQueue->Formatter = gcnew XmlMessageFormatter( p );
// Add an event handler for the ReceiveCompleted event.
myQueue->ReceiveCompleted += gcnew ReceiveCompletedEventHandler( MyNewQueue::MyReceiveCompleted );
// Begin the asynchronous receive operation.
myQueue->BeginReceive();
MyNewQueue::signal->WaitOne();
// Do other work on the current thread.
return 0;
}
using System;
using System.Messaging;
using System.Threading;
namespace MyProject
{
/// <summary>
/// Provides a container class for the example.
/// </summary>
public class MyNewQueue
{
// Define static class members.
static ManualResetEvent signal = new ManualResetEvent(false);
static int count = 0;
//**************************************************
// Provides an entry point into the application.
//
// This example performs asynchronous receive
// operation processing.
//**************************************************
public static void Main()
{
// Create an instance of MessageQueue. Set its formatter.
MessageQueue myQueue = new MessageQueue(".\\myQueue");
myQueue.Formatter = new XmlMessageFormatter(new Type[]
{typeof(String)});
// Add an event handler for the ReceiveCompleted event.
myQueue.ReceiveCompleted +=
new ReceiveCompletedEventHandler(MyReceiveCompleted);
// Begin the asynchronous receive operation.
myQueue.BeginReceive();
signal.WaitOne();
// Do other work on the current thread.
return;
}
//***************************************************
// Provides an event handler for the ReceiveCompleted
// event.
//***************************************************
private static void MyReceiveCompleted(Object source,
ReceiveCompletedEventArgs asyncResult)
{
try
{
// Connect to the queue.
MessageQueue mq = (MessageQueue)source;
// End the asynchronous receive operation.
Message m = mq.EndReceive(asyncResult.AsyncResult);
count += 1;
if (count == 10)
{
signal.Set();
}
// Restart the asynchronous receive operation.
mq.BeginReceive();
}
catch(MessageQueueException)
{
// Handle sources of MessageQueueException.
}
// Handle other exceptions.
return;
}
}
}
Imports System.Messaging
Imports System.Threading
' Provides a container class for the example.
Public Class MyNewQueue
' Define static class members.
Private Shared signal As New ManualResetEvent(False)
Private Shared count As Integer = 0
' Provides an entry point into the application.
'
' This example performs asynchronous receive
' operation processing.
Public Shared Sub Main()
' Create an instance of MessageQueue. Set its formatter.
Dim myQueue As New MessageQueue(".\myQueue")
myQueue.Formatter = New XmlMessageFormatter(New Type() _
{GetType([String])})
' Add an event handler for the ReceiveCompleted event.
AddHandler myQueue.ReceiveCompleted, AddressOf _
MyReceiveCompleted
' Begin the asynchronous receive operation.
myQueue.BeginReceive()
signal.WaitOne()
' Do other work on the current thread.
Return
End Sub
' Provides an event handler for the ReceiveCompleted
' event.
Private Shared Sub MyReceiveCompleted(ByVal [source] As _
[Object], ByVal asyncResult As ReceiveCompletedEventArgs)
Try
' Connect to the queue.
Dim mq As MessageQueue = CType([source], MessageQueue)
' End the asynchronous receive operation.
Dim m As Message = _
mq.EndReceive(asyncResult.AsyncResult)
count += 1
If count = 10 Then
signal.Set()
End If
' Restart the asynchronous receive operation.
mq.BeginReceive()
Catch
' Handle sources of MessageQueueException.
' Handle other exceptions.
End Try
Return
End Sub
End Class
Následující příklad kódu zařadí asynchronní požadavky do fronty. Volání, které BeginReceive použije vrácenou AsyncWaitHandle hodnotu. Rutina Main čeká na dokončení všech asynchronních operací před ukončením.
#using <system.dll>
#using <system.messaging.dll>
using namespace System;
using namespace System::Messaging;
using namespace System::Threading;
ref class MyNewQueue
{
public:
// Provides an event handler for the ReceiveCompleted
// event.
static void MyReceiveCompleted( Object^ source, ReceiveCompletedEventArgs^ asyncResult )
{
try
{
// Connect to the queue.
MessageQueue^ mq = dynamic_cast<MessageQueue^>(source);
// End the asynchronous receive operation.
mq->EndReceive( asyncResult->AsyncResult );
// Process the message here.
Console::WriteLine( "Message received." );
}
catch ( MessageQueueException^ )
{
// Handle sources of MessageQueueException.
}
// Handle other exceptions.
return;
}
};
// Provides an entry point into the application.
//
// This example performs asynchronous receive
// operation processing.
int main()
{
// Create an instance of MessageQueue. Set its formatter.
MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );
array<Type^>^p = gcnew array<Type^>(1);
p[ 0 ] = String::typeid;
myQueue->Formatter = gcnew XmlMessageFormatter( p );
// Add an event handler for the ReceiveCompleted event.
myQueue->ReceiveCompleted += gcnew ReceiveCompletedEventHandler( MyNewQueue::MyReceiveCompleted );
// Define wait handles for multiple operations.
array<WaitHandle^>^waitHandleArray = gcnew array<WaitHandle^>(10);
for ( int i = 0; i < 10; i++ )
{
// Begin asynchronous operations.
waitHandleArray[ i ] = myQueue->BeginReceive()->AsyncWaitHandle;
}
// Specify to wait for all operations to return.
WaitHandle::WaitAll( waitHandleArray );
return 0;
}
using System;
using System.Messaging;
using System.Threading;
namespace MyProject
{
/// <summary>
/// Provides a container class for the example.
/// </summary>
public class MyNewQueue
{
//**************************************************
// Provides an entry point into the application.
//
// This example performs asynchronous receive
// operation processing.
//**************************************************
public static void Main()
{
// Create an instance of MessageQueue. Set its formatter.
MessageQueue myQueue = new MessageQueue(".\\myQueue");
myQueue.Formatter = new XmlMessageFormatter(new Type[]
{typeof(String)});
// Add an event handler for the ReceiveCompleted event.
myQueue.ReceiveCompleted +=
new ReceiveCompletedEventHandler(MyReceiveCompleted);
// Define wait handles for multiple operations.
WaitHandle[] waitHandleArray = new WaitHandle[10];
for(int i=0; i<10; i++)
{
// Begin asynchronous operations.
waitHandleArray[i] =
myQueue.BeginReceive().AsyncWaitHandle;
}
// Specify to wait for all operations to return.
WaitHandle.WaitAll(waitHandleArray);
return;
}
//***************************************************
// Provides an event handler for the ReceiveCompleted
// event.
//***************************************************
private static void MyReceiveCompleted(Object source,
ReceiveCompletedEventArgs asyncResult)
{
try
{
// Connect to the queue.
MessageQueue mq = (MessageQueue)source;
// End the asynchronous receive operation.
Message m = mq.EndReceive(asyncResult.AsyncResult);
// Process the message here.
Console.WriteLine("Message received.");
}
catch(MessageQueueException)
{
// Handle sources of MessageQueueException.
}
// Handle other exceptions.
return;
}
}
}
Imports System.Messaging
Imports System.Threading
' Provides a container class for the example.
Public Class MyNewQueue
' Provides an entry point into the application.
'
' This example performs asynchronous receive
' operation processing.
Public Shared Sub Main()
' Create an instance of MessageQueue. Set its formatter.
Dim myQueue As New MessageQueue(".\myQueue")
myQueue.Formatter = New XmlMessageFormatter(New Type() _
{GetType([String])})
' Add an event handler for the ReceiveCompleted event.
AddHandler myQueue.ReceiveCompleted, AddressOf _
MyReceiveCompleted
' Define wait handles for multiple operations.
Dim waitHandleArray(10) As WaitHandle
Dim i As Integer
For i = 0 To 9
' Begin asynchronous operations.
waitHandleArray(i) = _
myQueue.BeginReceive().AsyncWaitHandle
Next i
' Specify to wait for all operations to return.
WaitHandle.WaitAll(waitHandleArray)
Return
End Sub
' Provides an event handler for the ReceiveCompleted
' event.
Private Shared Sub MyReceiveCompleted(ByVal [source] As _
[Object], ByVal asyncResult As ReceiveCompletedEventArgs)
Try
' Connect to the queue.
Dim mq As MessageQueue = CType([source], MessageQueue)
' End the asynchronous receive operation.
Dim m As Message = _
mq.EndReceive(asyncResult.AsyncResult)
' Process the message here.
Console.WriteLine("Message received.")
Catch
' Handle sources of MessageQueueException.
' Handle other exceptions.
End Try
Return
End Sub
End Class
Poznámky
Při asynchronním zpracování použijete BeginReceive k vyvolání ReceiveCompleted události, když byla zpráva odebrána z fronty.
ReceiveCompleted je vyvolána také v případě, že zpráva již ve frontě existuje.
Chcete-li použít BeginReceive, vytvořte obslužnou rutinu události, která zpracuje výsledky asynchronní operace a přidruží ji k delegátovi události. BeginReceive inicializuje asynchronní operaci příjmu; při MessageQueue příchodu ReceiveCompleted zprávy do fronty se zobrazí oznámení prostřednictvím vyvolání události. K MessageQueue této zprávě se pak dostanete voláním EndReceive(IAsyncResult).
Metoda BeginReceive vrátí okamžitě, ale asynchronní operace není dokončena, dokud obslužná rutina události není volána.
Vzhledem k tomu BeginReceive , že je asynchronní, můžete ji volat tak, aby přijímala zprávu z fronty bez blokování aktuálního vlákna provádění. Pokud chcete synchronně přijmout zprávu, použijte metodu Receive .
Po dokončení asynchronní operace můžete v obslužné rutině události volat BeginPeek nebo BeginReceive znovu přijímat oznámení.
Tato IAsyncResultBeginReceive metoda identifikuje asynchronní operaci, kterou metoda spustila. Tuto funkci můžete použít IAsyncResult po celou dobu životnosti operace, i když ji obecně nepoužíváte, dokud EndReceive(IAsyncResult) nebude volána. Pokud ale spustíte několik asynchronních operací, můžete jejich IAsyncResult hodnoty umístit do pole a určit, jestli se mají čekat na dokončení všech operací nebo jakékoli operace. V tomto případě použijete AsyncWaitHandle vlastnost k IAsyncResult identifikaci dokončené operace.
Pokud CanRead je false, událost dokončení je vyvolána, ale výjimka bude vyvolána při volání EndReceive(IAsyncResult).
Nepoužívejte asynchronní volání BeginReceive s transakcemi. Chcete-li provést transakční asynchronní operaci, volání BeginPeeka vložení transakce a (synchronní) Receive metody do obslužné rutiny události, kterou vytvoříte pro operaci náhledu. Obslužná rutina události může obsahovat funkce, jak je znázorněno v následujícím kódu jazyka C#.
myMessageQueue.BeginTransaction();
myMessageQueue.Receive();
myMessageQueue.CommitTransaction();
Následující tabulka ukazuje, zda je tato metoda k dispozici v různých režimech pracovní skupiny.
| Režim pracovní skupiny | K dispozici |
|---|---|
| Místní počítač | Ano |
| Název místního počítače a přímého formátu | Ano |
| Vzdálený počítač | Ne |
| Název vzdáleného počítače a přímého formátu | Ano |
Viz také
Platí pro
BeginReceive(TimeSpan)
Inicializuje asynchronní operaci příjmu, která má zadaný časový limit. Operace se nedokončuje, dokud se ve frontě nezobrazí zpráva nebo dojde k vypršení časového limitu.
public:
IAsyncResult ^ BeginReceive(TimeSpan timeout);
public IAsyncResult BeginReceive(TimeSpan timeout);
member this.BeginReceive : TimeSpan -> IAsyncResult
Public Function BeginReceive (timeout As TimeSpan) As IAsyncResult
Parametry
Návraty
Ten IAsyncResult identifikuje publikovaný asynchronní požadavek.
Výjimky
Hodnota zadaná pro timeout parametr není platná, pravděpodobně proto, že představuje záporné číslo.
Při přístupu k metodě řízení front zpráv došlo k chybě.
Příklady
Následující příklad kódu vytvoří asynchronní operaci příjmu. Příklad kódu vytvoří obslužnou rutinu MyReceiveCompletedudálosti a připojí ji k delegátu ReceiveCompleted obslužné rutiny události. Příklad kódu odešle zprávu do místní fronty zpráv a potom volání BeginReceive(TimeSpan), předání hodnoty časového limitu deset sekund.
ReceiveCompleted Při vyvolání události obslužná rutina události obdrží zprávu a zapíše text zprávy na obrazovku.
#using <System.Messaging.dll>
#using <System.dll>
using namespace System;
using namespace System::Messaging;
// Creates a new queue.
void CreateQueue(String^ queuePath, bool transactional)
{
if(!MessageQueue::Exists(queuePath))
{
MessageQueue^ queue = MessageQueue::Create(queuePath, transactional);
queue->Close();
}
else
{
Console::WriteLine("{0} already exists.", queuePath);
}
}
// Provides an event handler for the ReceiveCompleted event.
void HandleReceiveCompleted(Object^ source, ReceiveCompletedEventArgs^ e)
{
// Connect to the queue.
MessageQueue^ queue = (MessageQueue^)source;
// End the asynchronous receive operation.
Message^ msg = queue->EndReceive(e->AsyncResult);
// Display the message information on the screen.
Console::WriteLine("Message body: {0}", msg->Body);
queue->Close();
}
int main()
{
// Create a non-transactional queue on the local computer.
// Note that the queue might not be immediately accessible, and
// therefore this example might throw an exception of type
// System.Messaging.MessageQueueException when trying to send a
// message to the newly created queue.
MessageQueue^ queue = nullptr;
try
{
CreateQueue(".\\exampleQueue", false);
// Connect to a queue on the local computer.
queue = gcnew MessageQueue(".\\exampleQueue");
// Add an event handler for the ReceiveCompleted event.
queue->ReceiveCompleted += gcnew
ReceiveCompletedEventHandler(HandleReceiveCompleted);
// Send a message to the queue.
queue->Send("Example Message");
// Begin the asynchronous receive operation.
queue->BeginReceive(TimeSpan::FromSeconds(10.0));
// Simulate doing other work on the current thread.
System::Threading::Thread::Sleep(TimeSpan::FromSeconds(10.0));
}
catch (InvalidOperationException^)
{
Console::WriteLine("Please install Message Queuing.");
}
catch (MessageQueueException^ ex)
{
Console::WriteLine(ex->Message);
}
finally
{
queue->Close();
}
}
using System;
using System.Messaging;
public class QueueExample
{
public static void Main()
{
// Create a non-transactional queue on the local computer.
// Note that the queue might not be immediately accessible, and
// therefore this example might throw an exception of type
// System.Messaging.MessageQueueException when trying to send a
// message to the newly created queue.
CreateQueue(".\\exampleQueue", false);
// Connect to a queue on the local computer.
MessageQueue queue = new MessageQueue(".\\exampleQueue");
// Add an event handler for the ReceiveCompleted event.
queue.ReceiveCompleted += new
ReceiveCompletedEventHandler(MyReceiveCompleted);
// Send a message to the queue.
queue.Send("Example Message");
// Begin the asynchronous receive operation.
queue.BeginReceive(TimeSpan.FromSeconds(10.0));
// Simulate doing other work on the current thread.
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10.0));
return;
}
// Creates a new queue.
public static void CreateQueue(string queuePath, bool transactional)
{
if(!MessageQueue.Exists(queuePath))
{
MessageQueue.Create(queuePath, transactional);
}
else
{
Console.WriteLine(queuePath + " already exists.");
}
}
// Provides an event handler for the ReceiveCompleted event.
private static void MyReceiveCompleted(Object source,
ReceiveCompletedEventArgs asyncResult)
{
// Connect to the queue.
MessageQueue queue = (MessageQueue)source;
// End the asynchronous receive operation.
Message msg = queue.EndReceive(asyncResult.AsyncResult);
// Display the message information on the screen.
Console.WriteLine("Message body: {0}", (string)msg.Body);
}
}
Poznámky
Při asynchronním zpracování použijete BeginReceive k vyvolání ReceiveCompleted události, když bude zpráva k dispozici ve frontě nebo když vypršel zadaný interval času.
ReceiveCompleted je vyvolána také v případě, že zpráva již ve frontě existuje.
Chcete-li použít BeginReceive, vytvořte obslužnou rutinu události, která zpracuje výsledky asynchronní operace a přidruží ji k delegátovi události. BeginReceive inicializuje asynchronní operaci příjmu; při MessageQueue příchodu ReceiveCompleted zprávy do fronty se zobrazí oznámení prostřednictvím vyvolání události. K MessageQueue této zprávě se pak dostanete voláním EndReceive(IAsyncResult) nebo načtením výsledku pomocí příkazu ReceiveCompletedEventArgs.
Metoda BeginReceive vrátí okamžitě, ale asynchronní operace není dokončena, dokud obslužná rutina události není volána.
Vzhledem k tomu BeginReceive , že je asynchronní, můžete ji volat tak, aby přijímala zprávu z fronty bez blokování aktuálního vlákna provádění. Pokud chcete synchronně přijmout zprávu, použijte metodu Receive .
Po dokončení asynchronní operace můžete v obslužné rutině události volat BeginPeek nebo BeginReceive znovu přijímat oznámení.
Pokud CanRead je false, událost dokončení je vyvolána, ale výjimka bude vyvolána při volání EndReceive(IAsyncResult).
Tato IAsyncResultBeginReceive metoda identifikuje asynchronní operaci, kterou metoda spustila. Tuto funkci můžete použít IAsyncResult po celou dobu životnosti operace, i když ji obecně nepoužíváte, dokud EndReceive(IAsyncResult) nebude volána. Pokud ale spustíte několik asynchronních operací, můžete jejich IAsyncResult hodnoty umístit do pole a určit, jestli se mají čekat na dokončení všech operací nebo jakékoli operace. V tomto případě použijete AsyncWaitHandle vlastnost k IAsyncResult identifikaci dokončené operace.
Toto přetížení určuje časový limit. Pokud vyprší platnost intervalu určeného timeout parametrem, vyvolá tato komponenta ReceiveCompleted událost. Vzhledem k tomu, že žádná zpráva neexistuje, vyvolá následující volání EndReceive(IAsyncResult) výjimku.
Nepoužívejte asynchronní volání BeginReceive s transakcemi. Chcete-li provést transakční asynchronní operaci, volání BeginPeeka vložení transakce a (synchronní) Receive metody do obslužné rutiny události, kterou vytvoříte pro operaci náhledu. Obslužná rutina události může obsahovat funkce, jak je znázorněno v následujícím kódu jazyka C#.
myMessageQueue.BeginTransaction();
myMessageQueue.Receive();
myMessageQueue.CommitTransaction();
Následující tabulka ukazuje, zda je tato metoda k dispozici v různých režimech pracovní skupiny.
| Režim pracovní skupiny | K dispozici |
|---|---|
| Místní počítač | Ano |
| Název místního počítače a přímého formátu | Ano |
| Vzdálený počítač | Ne |
| Název vzdáleného počítače a přímého formátu | Ano |
Viz také
Platí pro
BeginReceive(TimeSpan, Object)
Inicializuje asynchronní operaci příjmu, která má zadaný časový limit a zadaný stav objekt, který poskytuje přidružené informace po celou dobu životnosti operace. Operace se nedokončuje, dokud se ve frontě nezobrazí zpráva nebo dojde k vypršení časového limitu.
public:
IAsyncResult ^ BeginReceive(TimeSpan timeout, System::Object ^ stateObject);
public IAsyncResult BeginReceive(TimeSpan timeout, object stateObject);
member this.BeginReceive : TimeSpan * obj -> IAsyncResult
Public Function BeginReceive (timeout As TimeSpan, stateObject As Object) As IAsyncResult
Parametry
- stateObject
- Object
Stavový objekt určený aplikací, který obsahuje informace přidružené k asynchronní operaci.
Návraty
Ten IAsyncResult identifikuje publikovaný asynchronní požadavek.
Výjimky
Hodnota zadaná pro parametr timeout není platná.
Při přístupu k metodě řízení front zpráv došlo k chybě.
Příklady
Následující příklad kódu vytvoří asynchronní operaci příjmu. Příklad kódu vytvoří obslužnou rutinu MyReceiveCompletedudálosti a připojí ji k delegátu ReceiveCompleted obslužné rutiny události. Příklad kódu odešle zprávu do místní fronty zpráv a pak volá , BeginReceive(TimeSpan, Object)předává hodnotu časového limitu deset sekund a jedinečné celé číslo, které identifikuje danou zprávu.
ReceiveCompleted Při vyvolání události obslužná rutina události obdrží zprávu a zapíše text zprávy a identifikátor celé zprávy na obrazovku.
#using <System.Messaging.dll>
#using <System.dll>
using namespace System;
using namespace System::Messaging;
// Creates a new queue.
void CreateQueue(String^ queuePath, bool transactional)
{
if(!MessageQueue::Exists(queuePath))
{
MessageQueue^ queue = MessageQueue::Create(queuePath, transactional);
queue->Close();
}
else
{
Console::WriteLine("{0} already exists.", queuePath);
}
}
// Provides an event handler for the ReceiveCompleted event.
void HandleReceiveCompleted(Object^ source, ReceiveCompletedEventArgs^ e)
{
// Connect to the queue.
MessageQueue^ queue = (MessageQueue^)source;
// End the asynchronous receive operation.
Message^ msg = queue->EndReceive(e->AsyncResult);
// Display the message information on the screen.
Console::WriteLine("Message number: {0}", e->AsyncResult->AsyncState);
Console::WriteLine("Message body: {0}", msg->Body);
queue->Close();
}
int main()
{
// Create a non-transactional queue on the local computer.
// Note that the queue might not be immediately accessible, and
// therefore this example might throw an exception of type
// System.Messaging.MessageQueueException when trying to send a
// message to the newly created queue.
MessageQueue^ queue = nullptr;
// Represents a state object associated with each message.
int messageNumber = 0;
try
{
CreateQueue(".\\exampleQueue", false);
// Connect to a queue on the local computer.
queue = gcnew MessageQueue(".\\exampleQueue");
// Add an event handler for the ReceiveCompleted event.
queue->ReceiveCompleted += gcnew
ReceiveCompletedEventHandler(HandleReceiveCompleted);
// Send a message to the queue.
queue->Send("Example Message");
// Begin the asynchronous receive operation.
queue->BeginReceive(TimeSpan::FromSeconds(10.0), messageNumber++);
// Simulate doing other work on the current thread.
System::Threading::Thread::Sleep(TimeSpan::FromSeconds(10.0));
}
catch (InvalidOperationException^)
{
Console::WriteLine("Please install Message Queuing.");
}
catch (MessageQueueException^ ex)
{
Console::WriteLine(ex->Message);
}
finally
{
queue->Close();
}
}
using System;
using System.Messaging;
public class QueueExample
{
// Represents a state object associated with each message.
static int messageNumber = 0;
public static void Main()
{
// Create a non-transactional queue on the local computer.
// Note that the queue might not be immediately accessible, and
// therefore this example might throw an exception of type
// System.Messaging.MessageQueueException when trying to send a
// message to the newly created queue.
CreateQueue(".\\exampleQueue", false);
// Connect to a queue on the local computer.
MessageQueue queue = new MessageQueue(".\\exampleQueue");
// Add an event handler for the ReceiveCompleted event.
queue.ReceiveCompleted += new
ReceiveCompletedEventHandler(MyReceiveCompleted);
// Send a message to the queue.
queue.Send("Example Message");
// Begin the asynchronous receive operation.
queue.BeginReceive(TimeSpan.FromSeconds(10.0), messageNumber++);
// Simulate doing other work on the current thread.
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10.0));
return;
}
// Creates a new queue.
public static void CreateQueue(string queuePath, bool transactional)
{
if(!MessageQueue.Exists(queuePath))
{
MessageQueue.Create(queuePath, transactional);
}
else
{
Console.WriteLine(queuePath + " already exists.");
}
}
// Provides an event handler for the ReceiveCompleted event.
private static void MyReceiveCompleted(Object source,
ReceiveCompletedEventArgs asyncResult)
{
// Connect to the queue.
MessageQueue queue = (MessageQueue)source;
// End the asynchronous receive operation.
Message msg = queue.EndReceive(asyncResult.AsyncResult);
// Display the message information on the screen.
Console.WriteLine("Message number: {0}",
(int)asyncResult.AsyncResult.AsyncState);
Console.WriteLine("Message body: {0}", (string)msg.Body);
}
}
Poznámky
Při asynchronním zpracování použijete BeginReceive k vyvolání ReceiveCompleted události, když bude zpráva k dispozici ve frontě nebo když vypršel zadaný interval času.
ReceiveCompleted je vyvolána také v případě, že zpráva již ve frontě existuje.
Toto přetížení použijte k přidružení informací k operaci, která se zachová po celou dobu životnosti operace. Obslužná rutina události může tyto informace rozpoznat tak, že se podívá na AsyncState vlastnost IAsyncResult , která je přidružena k operaci.
Chcete-li použít BeginReceive, vytvořte obslužnou rutinu události, která zpracuje výsledky asynchronní operace a přidruží ji k delegátovi události. BeginReceive inicializuje asynchronní operaci příjmu; při MessageQueue příchodu ReceiveCompleted zprávy do fronty se zobrazí oznámení prostřednictvím vyvolání události. K MessageQueue této zprávě se pak dostanete voláním EndReceive(IAsyncResult) nebo načtením výsledku pomocí příkazu ReceiveCompletedEventArgs.
Metoda BeginReceive vrátí okamžitě, ale asynchronní operace není dokončena, dokud obslužná rutina události není volána.
Vzhledem k tomu BeginReceive , že je asynchronní, můžete ji volat tak, aby přijímala zprávu z fronty bez blokování aktuálního vlákna provádění. Pokud chcete synchronně přijmout zprávu, použijte metodu Receive .
Po dokončení asynchronní operace můžete v obslužné rutině události volat BeginPeek nebo BeginReceive znovu přijímat oznámení.
Tato IAsyncResultBeginReceive metoda identifikuje asynchronní operaci, kterou metoda spustila. Tuto funkci můžete použít IAsyncResult po celou dobu životnosti operace, i když ji obecně nepoužíváte, dokud EndReceive(IAsyncResult) nebude volána. Pokud ale spustíte několik asynchronních operací, můžete jejich IAsyncResult hodnoty umístit do pole a určit, jestli se mají čekat na dokončení všech operací nebo jakékoli operace. V tomto případě použijete AsyncWaitHandle vlastnost k IAsyncResult identifikaci dokončené operace.
Toto přetížení určuje časový limit a objekt stavu. Pokud vyprší platnost intervalu určeného timeout parametrem, vyvolá tato komponenta ReceiveCompleted událost. Vzhledem k tomu, že žádná zpráva neexistuje, vyvolá následující volání EndReceive(IAsyncResult) výjimku.
Objekt stavu přidruží informace o stavu k operaci. Pokud například voláte BeginReceive vícekrát za účelem zahájení více operací, můžete každou operaci identifikovat prostřednictvím samostatného objektu stavu, který definujete.
Objekt stavu můžete také použít k předávání informací napříč vlákny procesu. Pokud je vlákno spuštěno, ale zpětné volání je v jiném vlákně v asynchronním scénáři, stavový objekt se zařazuje a předává zpět spolu s informacemi z události.
Nepoužívejte asynchronní volání BeginReceive s transakcemi. Chcete-li provést transakční asynchronní operaci, volání BeginPeeka vložení transakce a (synchronní) Receive metody do obslužné rutiny události, kterou vytvoříte pro operaci náhledu. Obslužná rutina události může obsahovat funkce, jak je znázorněno v následujícím kódu jazyka C#.
myMessageQueue.BeginTransaction();
myMessageQueue.Receive();
myMessageQueue.CommitTransaction();
Následující tabulka ukazuje, zda je tato metoda k dispozici v různých režimech pracovní skupiny.
| Režim pracovní skupiny | K dispozici |
|---|---|
| Místní počítač | Ano |
| Název místního počítače a přímého formátu | Ano |
| Vzdálený počítač | Ne |
| Název vzdáleného počítače a přímého formátu | Ano |
Viz také
Platí pro
BeginReceive(TimeSpan, Object, AsyncCallback)
Inicializuje asynchronní operaci příjmu, která má zadaný časový limit a zadaný stav objekt, který poskytuje přidružené informace po celou dobu životnosti operace. Toto přetížení obdrží oznámení prostřednictvím zpětného volání identity obslužné rutiny události pro operaci. Operace se nedokončuje, dokud se ve frontě nezobrazí zpráva nebo dojde k vypršení časového limitu.
public:
IAsyncResult ^ BeginReceive(TimeSpan timeout, System::Object ^ stateObject, AsyncCallback ^ callback);
public IAsyncResult BeginReceive(TimeSpan timeout, object stateObject, AsyncCallback callback);
member this.BeginReceive : TimeSpan * obj * AsyncCallback -> IAsyncResult
Public Function BeginReceive (timeout As TimeSpan, stateObject As Object, callback As AsyncCallback) As IAsyncResult
Parametry
- stateObject
- Object
Stavový objekt určený aplikací, který obsahuje informace přidružené k asynchronní operaci.
- callback
- AsyncCallback
Tím AsyncCallback se zobrazí oznámení o dokončení asynchronní operace.
Návraty
Ten IAsyncResult identifikuje publikovaný asynchronní požadavek.
Výjimky
Hodnota zadaná pro parametr timeout není platná.
Při přístupu k metodě řízení front zpráv došlo k chybě.
Příklady
Následující příklad kódu vytvoří asynchronní operaci příjmu. Příklad kódu odešle zprávu do místní fronty zpráv a pak volá BeginReceive(TimeSpan, Object, AsyncCallback), předává: hodnotu časového limitu deset sekund; jedinečné celé číslo, které identifikuje tuto konkrétní zprávu; a novou instanciAsyncCallback, která identifikuje obslužnou rutinu události. MyReceiveCompleted
ReceiveCompleted Při vyvolání události obslužná rutina události obdrží zprávu a zapíše text zprávy a identifikátor celé zprávy na obrazovku.
#using <System.Messaging.dll>
#using <System.dll>
using namespace System;
using namespace System::Messaging;
// Creates a new queue.
void CreateQueue(String^ queuePath, bool transactional)
{
if (!MessageQueue::Exists(queuePath))
{
MessageQueue^ queue = MessageQueue::Create(queuePath, transactional);
queue->Close();
}
else
{
Console::WriteLine("{0} already exists.", queuePath);
}
}
// Provides an event handler for the ReceiveCompleted event.
void HandleReceiveCompleted(IAsyncResult^ asyncResult)
{
// Connect to the queue.
MessageQueue^ queue = gcnew MessageQueue(".\\exampleQueue");
// End the asynchronous receive operation.
Message^ msg = queue->EndReceive(asyncResult);
// Display the message information on the screen.
Console::WriteLine("Message number: {0}", asyncResult->AsyncState);
Console::WriteLine("Message body: {0}", msg->Body);
queue->Close();
}
int main()
{
// Represents a state object associated with each message.
int messageNumber = 0;
// Create a non-transactional queue on the local computer.
// Note that the queue might not be immediately accessible, and
// therefore this example might throw an exception of type
// System.Messaging.MessageQueueException when trying to send a
// message to the newly created queue.
MessageQueue^ queue = nullptr;
try
{
CreateQueue(".\\exampleQueue", false);
// Connect to a queue on the local computer.
queue = gcnew MessageQueue(".\\exampleQueue");
// Send a message to the queue.
queue->Send("Example Message");
// Begin the asynchronous receive operation.
queue->BeginReceive(TimeSpan::FromSeconds(10.0), messageNumber++,
gcnew AsyncCallback(HandleReceiveCompleted));
// Simulate doing other work on the current thread.
System::Threading::Thread::Sleep(TimeSpan::FromSeconds(10.0));
}
catch (InvalidOperationException^)
{
Console::WriteLine("Please install Message Queuing.");
}
catch (MessageQueueException^ ex)
{
Console::WriteLine(ex->Message);
}
finally
{
queue->Close();
}
}
using System;
using System.Messaging;
public class QueueExample
{
// Represents a state object associated with each message.
static int messageNumber = 0;
public static void Main()
{
// Create a non-transactional queue on the local computer.
// Note that the queue might not be immediately accessible, and
// therefore this example might throw an exception of type
// System.Messaging.MessageQueueException when trying to send a
// message to the newly created queue.
CreateQueue(".\\exampleQueue", false);
// Connect to a queue on the local computer.
MessageQueue queue = new MessageQueue(".\\exampleQueue");
// Send a message to the queue.
queue.Send("Example Message");
// Begin the asynchronous receive operation.
queue.BeginReceive(TimeSpan.FromSeconds(10.0), messageNumber++,
new AsyncCallback(MyReceiveCompleted));
// Simulate doing other work on the current thread.
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10.0));
return;
}
// Creates a new queue.
public static void CreateQueue(string queuePath, bool transactional)
{
if(!MessageQueue.Exists(queuePath))
{
MessageQueue.Create(queuePath, transactional);
}
else
{
Console.WriteLine(queuePath + " already exists.");
}
}
// Provides an event handler for the ReceiveCompleted event.
private static void MyReceiveCompleted(IAsyncResult asyncResult)
{
// Connect to the queue.
MessageQueue queue = new MessageQueue(".\\exampleQueue");
// End the asynchronous receive operation.
Message msg = queue.EndReceive(asyncResult);
// Display the message information on the screen.
Console.WriteLine("Message number: {0}", (int)asyncResult.AsyncState);
Console.WriteLine("Message body: {0}", (string)msg.Body);
}
}
Poznámky
Pokud použijete toto přetížení, zpětné volání zadané v parametru zpětného volání je vyvoláno přímo při zpřístupnění zprávy ve frontě nebo v případě vypršení zadaného intervalu času; ReceiveCompleted událost není vyvolána. Další přetížení BeginReceive spoléhá na tuto komponentu k vyvolání ReceiveCompleted události.
ReceiveCompleted je vyvolána také v případě, že zpráva již ve frontě existuje.
Chcete-li použít BeginReceive, vytvořte obslužnou rutinu události, která zpracuje výsledky asynchronní operace a přidruží ji k delegátovi události. BeginReceive inicializuje asynchronní operaci příjmu; při MessageQueue příchodu ReceiveCompleted zprávy do fronty se zobrazí oznámení prostřednictvím vyvolání události. K MessageQueue této zprávě se pak dostanete voláním EndReceive(IAsyncResult) nebo načtením výsledku pomocí příkazu ReceiveCompletedEventArgs.
Metoda BeginReceive vrátí okamžitě, ale asynchronní operace není dokončena, dokud obslužná rutina události není volána.
Vzhledem k tomu BeginReceive , že je asynchronní, můžete ji volat tak, aby přijímala zprávu z fronty bez blokování aktuálního vlákna provádění. Pokud chcete synchronně přijmout zprávu, použijte metodu Receive .
Po dokončení asynchronní operace můžete v obslužné rutině události volat BeginPeek nebo BeginReceive znovu přijímat oznámení.
Tato IAsyncResultBeginReceive metoda identifikuje asynchronní operaci, kterou metoda spustila. Tuto funkci můžete použít IAsyncResult po celou dobu životnosti operace, i když ji obecně nepoužíváte, dokud EndReceive(IAsyncResult) nebude volána. Pokud ale spustíte několik asynchronních operací, můžete jejich IAsyncResult hodnoty umístit do pole a určit, jestli se mají čekat na dokončení všech operací nebo jakékoli operace. V tomto případě použijete AsyncWaitHandle vlastnost k IAsyncResult identifikaci dokončené operace.
Objekt stavu přidruží informace o stavu k operaci. Pokud například voláte BeginReceive vícekrát za účelem zahájení více operací, můžete každou operaci identifikovat prostřednictvím samostatného objektu stavu, který definujete.
Objekt stavu můžete také použít k předávání informací napříč vlákny procesu. Pokud je vlákno spuštěno, ale zpětné volání je v jiném vlákně v asynchronním scénáři, stavový objekt se zařazuje a předává zpět spolu s informacemi z události.
Nepoužívejte asynchronní volání BeginReceive s transakcemi. Chcete-li provést transakční asynchronní operaci, volání BeginPeeka vložení transakce a (synchronní) Receive metody do obslužné rutiny události, kterou vytvoříte pro operaci náhledu. Obslužná rutina události může obsahovat funkce, jak je znázorněno v následujícím kódu jazyka C#.
myMessageQueue.BeginTransaction();
myMessageQueue.Receive();
myMessageQueue.CommitTransaction();
Následující tabulka ukazuje, zda je tato metoda k dispozici v různých režimech pracovní skupiny.
| Režim pracovní skupiny | K dispozici |
|---|---|
| Místní počítač | Ano |
| Název místního počítače a přímého formátu | Ano |
| Vzdálený počítač | Ne |
| Název vzdáleného počítače a přímého formátu | Ano |
Viz také
Platí pro
BeginReceive(TimeSpan, Cursor, Object, AsyncCallback)
Iniciuje asynchronní operaci příjmu, která má zadaný časový limit a používá zadaný kurzor a zadaný stav objekt. Objekt stavu poskytuje přidružené informace po celou dobu životnosti operace. Toto přetížení obdrží oznámení prostřednictvím zpětného volání identity obslužné rutiny události pro operaci. Operace se nedokončuje, dokud se ve frontě nezobrazí zpráva nebo dojde k vypršení časového limitu.
public:
IAsyncResult ^ BeginReceive(TimeSpan timeout, System::Messaging::Cursor ^ cursor, System::Object ^ state, AsyncCallback ^ callback);
public IAsyncResult BeginReceive(TimeSpan timeout, System.Messaging.Cursor cursor, object state, AsyncCallback callback);
member this.BeginReceive : TimeSpan * System.Messaging.Cursor * obj * AsyncCallback -> IAsyncResult
Public Function BeginReceive (timeout As TimeSpan, cursor As Cursor, state As Object, callback As AsyncCallback) As IAsyncResult
Parametry
- state
- Object
Stavový objekt určený aplikací, který obsahuje informace přidružené k asynchronní operaci.
- callback
- AsyncCallback
Tím AsyncCallback se zobrazí oznámení o dokončení asynchronní operace.
Návraty
Ten IAsyncResult identifikuje publikovaný asynchronní požadavek.
Výjimky
Parametr cursor je null.
Hodnota zadaná pro parametr timeout není platná.
Při přístupu k metodě řízení front zpráv došlo k chybě.
Poznámky
Pokud použijete toto přetížení, zpětné volání zadané v parametru zpětného volání je vyvoláno přímo při zpřístupnění zprávy ve frontě nebo v případě vypršení zadaného intervalu času; ReceiveCompleted událost není vyvolána. Další přetížení BeginReceive spoléhá na tuto komponentu k vyvolání ReceiveCompleted události.
ReceiveCompleted je vyvolána také v případě, že zpráva již ve frontě existuje.
Chcete-li použít BeginReceive, vytvořte obslužnou rutinu události, která zpracuje výsledky asynchronní operace a přidruží ji k delegátovi události. BeginReceive inicializuje asynchronní operaci příjmu; při MessageQueue příchodu ReceiveCompleted zprávy do fronty se zobrazí oznámení prostřednictvím vyvolání události. K MessageQueue této zprávě se pak dostanete voláním EndReceive(IAsyncResult) nebo načtením výsledku pomocí příkazu ReceiveCompletedEventArgs.
Metoda BeginReceive vrátí okamžitě, ale asynchronní operace není dokončena, dokud obslužná rutina události není volána.
Vzhledem k tomu BeginReceive , že je asynchronní, můžete ji volat tak, aby přijímala zprávu z fronty bez blokování aktuálního vlákna provádění. Pokud chcete synchronně přijmout zprávu, použijte metodu Receive .
Po dokončení asynchronní operace můžete v obslužné rutině události volat BeginPeek nebo BeginReceive znovu přijímat oznámení.
Tato IAsyncResultBeginReceive metoda identifikuje asynchronní operaci, kterou metoda spustila. Tuto funkci můžete použít IAsyncResult po celou dobu životnosti operace, i když ji obecně nepoužíváte, dokud EndReceive(IAsyncResult) nebude volána. Pokud ale spustíte několik asynchronních operací, můžete jejich IAsyncResult hodnoty umístit do pole a určit, jestli se mají čekat na dokončení všech operací nebo jakékoli operace. V tomto případě použijte AsyncWaitHandle vlastnost IAsyncResult identifikaci dokončené operace.
Objekt stavu přidruží informace o stavu k operaci. Pokud například voláte BeginReceive vícekrát za účelem zahájení více operací, můžete každou operaci identifikovat prostřednictvím samostatného objektu stavu, který definujete.
Objekt stavu můžete také použít k předávání informací napříč vlákny procesu. Pokud je vlákno spuštěno, ale zpětné volání je v jiném vlákně v asynchronním scénáři, stavový objekt se zařazuje a předává zpět spolu s informacemi z události.
Nepoužívejte asynchronní volání BeginReceive s transakcemi. Chcete-li provést transakční asynchronní operaci, volání BeginPeeka vložení transakce a (synchronní) Receive metody do obslužné rutiny události, kterou vytvoříte pro operaci náhledu. Obslužná rutina události může obsahovat funkce, jak je znázorněno v následujícím kódu jazyka C#.
myMessageQueue.BeginTransaction();
myMessageQueue.Receive();
myMessageQueue.CommitTransaction();
Následující tabulka ukazuje, zda je tato metoda k dispozici v různých režimech pracovní skupiny.
| Režim pracovní skupiny | K dispozici |
|---|---|
| Místní počítač | Ano |
| Název místního počítače a přímého formátu | Ano |
| Vzdálený počítač | Ne |
| Název vzdáleného počítače a přímého formátu | Ano |
Viz také
Platí pro
Bezpečný přístup z více vláken
Metoda není bezpečná pro přístup z více vláken.