让IAsyncResult触发“已完成”事件

时间:2010-07-30 14:46:08

标签: .net delegates remoting

我正在使用远程处理来执行某些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”事件或类似事件?

由于

2 个答案:

答案 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);
  }
}