我正在使用远程处理来执行某些IPC通信,并提出以下问题:
当我调用委托收集数据服务器端时,可能会在收集IAsyncResult时在客户端上触发事件?
以下代码在VC ++中,但.net代码是.net代码。
GetFileTextDelegate ^svd = gcnew GetFileTextDelegate(obj, &BaseRemoteObject::GetFileText);
IAsyncResult ^arValSet = svd->BeginInvoke(nullptr, nullptr);
String ^result = svd->EndInvoke(arValSet);
在此示例中,最后一行代码将仅锁定当前线程,直到Invoke完成。是否有可能只是潜入“IAsyncResult_Completed”事件或类似事件?
由于
答案 0 :(得分:2)
是的,MSDN上有good example使用AsyncCallback
委托执行此操作。
执行此操作的最简单方法是在委托上使用BeginInvoke
,并在操作完成时向其传递AsynCallback
委托的实例以进行调用。
在C#中(我比托管C ++更熟悉)你基本上会写:
// when the async operation completes, YourCallBackMethod will be run
AsyncCallback callback = new AsynCallback( YourCallBackMethod );
callAsynchronously.BeginInvoke( callback, null );
在回调方法中,您必须在异步运行的委托上调用EndInvoke()
。最简单的方法是使用提供的IAsyncResult
。
答案 1 :(得分:1)
您应该能够将委托(AsyncCallBack)传递给BeginInvoke,它将在异步方法执行完毕后执行。
这是一个简单但直截了当的例子:
using System;
using System.Threading;
using System.Runtime.Remoting.Messaging;
class MainClass
{
delegate int MyDelegate(string s);
static void Main(string[] args)
{
MyDelegate X = new MyDelegate(DoSomething);
AsyncCallback cb = new AsyncCallback(DoSomething2);
IAsyncResult ar = X.BeginInvoke("Hello", cb, null);
Console.WriteLine("Press any key to continue");
Console.ReadLine();
}
static int DoSomething(string s)
{
Console.WriteLine("doooooooooooooooo");
return 0;
}
static void DoSomething2(IAsyncResult ar)
{
MyDelegate X = (MyDelegate)((AsyncResult)ar).AsyncDelegate;
X.EndInvoke(ar);
}
}