using namespace System;
using namespace System::Threading;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Contexts;
using namespace System::Runtime::Remoting::Messaging;
//
// Context-Bound type with Synchronization Context Attribute
//
public ref class SampleSyncronized: public ContextBoundObject
{
public:
// A method that does some work - returns the square of the given number
int Square( int i )
{
Console::Write( "SampleSyncronized::Square called. " );
Console::WriteLine( "The hash of the current thread is: {0}", Thread::CurrentThread->GetHashCode() );
return i * i;
}
};
delegate int SampSyncSqrDelegate( //
// Async delegate used to call a method with this signature asynchronously
//
int i );
//Main sample class
int main()
{
int callParameter = 0;
int callResult = 0;
//Create an instance of a context-bound type SampleSynchronized
//Because SampleSynchronized is context-bound, the Object* sampSyncObj
//is a transparent proxy
SampleSyncronized^ sampSyncObj = gcnew SampleSyncronized;
//call the method synchronously
Console::Write( "Making a synchronous call on the Object*. " );
Console::WriteLine( "The hash of the current thread is: {0}", Thread::CurrentThread->GetHashCode() );
callParameter = 10;
callResult = sampSyncObj->Square( callParameter );
Console::WriteLine( "Result of calling sampSyncObj.Square with {0} is {1}.\n\n", callParameter, callResult );
//call the method asynchronously
Console::Write( "Making an asynchronous call on the Object*. " );
Console::WriteLine( "The hash of the current thread is: {0}", Thread::CurrentThread->GetHashCode() );
SampSyncSqrDelegate^ sampleDelegate = gcnew SampSyncSqrDelegate( sampSyncObj, &SampleSyncronized::Square );
callParameter = 17;
IAsyncResult^ aResult = sampleDelegate->BeginInvoke( callParameter, nullptr, 0 );
//Wait for the call to complete
aResult->AsyncWaitHandle->WaitOne();
callResult = sampleDelegate->EndInvoke( aResult );
Console::WriteLine( "Result of calling sampSyncObj.Square with {0} is {1}.", callParameter, callResult );
}