【问题标题】:Having an IAsyncResult fire a "completed" event让 IAsyncResult 触发“完成”事件
【发布时间】:2010-07-30 14:46:07
【问题描述】:

我正在使用 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”事件或类似事件?

谢谢

【问题讨论】:

    标签: .net delegates remoting


    【解决方案1】:

    是的,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。

    【讨论】:

    • 问你就会收到。我在搜索时从未想到“回调”这个词。谢谢
    【解决方案2】:

    您应该能够将委托 (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);
      }
    }
    

    【讨论】:

    • FWIW,MSDN 示例“远程处理示例:异步远程处理”提到远程处理不适用于静态函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2012-09-24
    • 1970-01-01
    • 2015-04-14
    • 2015-10-16
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多