Если IAsyncResult запустит «завершенное» событие - PullRequest
2 голосов
/ 30 июля 2010

Я использую Remoting для выполнения IPC-связи, и у меня возникает следующий вопрос:

Когда я вызываю делегатов для сбора данных на стороне сервера, возможно, что событие будет запущено на клиенте, когдаIAsyncResult собран?

Следующий код находится в VC ++, но .net-код - это .net-код.

  GetFileTextDelegate ^svd = gcnew GetFileTextDelegate(obj, &BaseRemoteObject::GetFileText);
  IAsyncResult        ^arValSet = svd->BeginInvoke(nullptr, nullptr);
  String ^result = svd->EndInvoke(arValSet);

В этом примере последняя строка кода просто заблокирует текущий потокпока вызов не будет завершен.Можно ли просто подписаться на событие «IAsyncResult_Completed» или что-то подобное?

Спасибо

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Да, на MSDN есть хороший пример использования делегата 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 голос
/ 30 июля 2010

Вы должны быть в состоянии передать делегат (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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...