} //ByRefCallBack() public void ByValCallBack(IAsyncResult ar) { try { ByValDelegate d = (ByValDelegate)((AsyncResult)ar).AsyncDelegate; ForwardByVal fbv = d.EndInvoke(ar); Console.WriteLine("Forwarded message: {0}", fbv.Message); m_ResetEvent.Set(); }//try catch (Exception e) { Console.WriteLine("Exception in ByValCallBack(): {0}", e.ToString()); System.Diagnostics.Process.GetCurrentProcess().Kill(); }//catch finally { //Unregister the channels so app can execute again. if (m_HttpChannel != null) { ChannelServices.UnregisterChannel(m_HttpChannel); }//if if (m_TcpChannel != null) { ChannelServices.UnregisterChannel(m_TcpChannel); } //if } //finally } //ByRefCallBack()
} //ClientInvoke /// <summary> /// Used by AsyncClient.Run() to invoke the proxy method repeatedly. /// </summary> /// <param name="obj"></param> public void ClientInvokeAsync(object RemoteObj) { try { if (RemoteObj == null) { Console.WriteLine("Could not locate server."); return; }//if switch (m_CallConv) { case CallingConvention.ByRef: { AsyncCallback cb = new AsyncCallback(ByRefCallBack); HelloServerByRef hsbr = (HelloServerByRef)RemoteObj; ByRefDelegate del = new ByRefDelegate(hsbr.HelloMethod); ForwardByRef fbr = new ForwardByRef(); IAsyncResult ar = del.BeginInvoke("Calling ByRef async", fbr, cb, null); lock (this) { m_ResetEvent = new ManualResetEvent(false); }//lock m_ResetEvent.WaitOne(); if (m_ThreadNumber > 0) { Console.WriteLine("From thread {0}", m_ThreadNumber.ToString()); } //if break; } //case case CallingConvention.ByVal: { AsyncCallback cb = new AsyncCallback(ByValCallBack); HelloServerByVal hsbv = (HelloServerByVal)RemoteObj; ByValDelegate del = new ByValDelegate(hsbv.HelloMethod); ForwardByVal fbv = new ForwardByVal(); IAsyncResult ar = del.BeginInvoke("Calling ByVal async", fbv, cb, null); lock (this) { m_ResetEvent = new ManualResetEvent(false); }//lock m_ResetEvent.WaitOne(); if (m_ThreadNumber > 0) { Console.WriteLine("From thread {0}", m_ThreadNumber.ToString()); } //if break; } //case } //switch } //try catch (Exception e) { Console.WriteLine("Exception in Client.ClientInvokeAsync(): {0}", e.ToString()); System.Diagnostics.Process.GetCurrentProcess().Kill(); } //catch return; } //ClientInvokeAsync()
} //ByRefCallBack() public void ByValCallBack(IAsyncResult ar) { try { ByValDelegate d = (ByValDelegate)((AsyncResult)ar).AsyncDelegate; ForwardByVal fbv = d.EndInvoke(ar); Console.WriteLine("Forwarded message: {0}", fbv.Message); m_ResetEvent.Set(); }//try catch (Exception e) { Console.WriteLine("Exception in ByValCallBack(): {0}", e.ToString()); System.Diagnostics.Process.GetCurrentProcess().Kill(); } //catch } //ByRefCallBack()
}//ClientInvoke /// <summary> /// Used by AsyncClient.Run() to invoke the proxy method repeatedly. /// </summary> /// <param name="obj"></param> public void ClientInvokeAsync(object RemoteObj) { try { if (RemoteObj == null) { Console.WriteLine("Could not locate server."); return; }//if switch (m_CallConv) { case CallingConvention.ByRef: { AsyncCallback cb = new AsyncCallback(ByRefCallBack); HelloServerByRef hsbr = (HelloServerByRef)RemoteObj; ByRefDelegate del = new ByRefDelegate(hsbr.HelloMethod); ForwardByRef fbr = new ForwardByRef(); IAsyncResult ar = del.BeginInvoke("Calling ByRef async", fbr, cb, null); lock(this) { m_ResetEvent = new ManualResetEvent(false); }//lock m_ResetEvent.WaitOne(); if (m_ThreadNumber > 0) { Console.WriteLine("From thread {0}", m_ThreadNumber.ToString()); }//if break; }//case case CallingConvention.ByVal: { AsyncCallback cb = new AsyncCallback(ByValCallBack); HelloServerByVal hsbv = (HelloServerByVal)RemoteObj; ByValDelegate del = new ByValDelegate(hsbv.HelloMethod); ForwardByVal fbv = new ForwardByVal(); IAsyncResult ar = del.BeginInvoke("Calling ByVal async", fbv, cb, null); lock(this) { m_ResetEvent = new ManualResetEvent(false); }//lock m_ResetEvent.WaitOne(); if (m_ThreadNumber > 0) { Console.WriteLine("From thread {0}", m_ThreadNumber.ToString()); }//if break; }//case }//switch }//try catch (Exception e) { Console.WriteLine("Exception in Client.ClientInvokeAsync(): {0}", e.ToString()); System.Diagnostics.Process.GetCurrentProcess().Kill(); }//catch return; }//ClientInvokeAsync()