Tenemos este escenario común en el que tenemos un método que realiza alguna acción asincrónicamente y plantea un evento cuando está hecho.¿Hay una manera genérica de sincronizar un método asincrónico?
Hay momentos en los que queremos que se haga de forma sincrónica en lugar así que tenemos código que es similar a esto:
ManualResetEvent reset = new ManualResetEvent(false);
someobject.AsyncActionDone += (sender, args) => reset.Set();
someobject.PerformAsyncAction();
reset.WaitOne();
¿Hay una manera de escribir un método de ayuda para hacer esto? Puedo pasar la acción para realizarla, pero no estoy seguro de cómo pasar algo que permita que el método de ayuda sepa qué evento escuchar, ya que no parece que se pueda pasar en un EventHandler como parámetro.
Preferiblemente una solución que no requiere reflexión
Parece haber cierta confusión, esto es una muestra de lo que está someObject clase es como:
public class SomeClass
{
private ExternalServer someServerOverTheNetwork = new ExternalServer();
public event EventHandler AsyncActionDone;
public Data SomeData { get; set; }
public void PerformAsyncAction()
{
someServerOverTheNetwork.GetSomeData(OnDataRetrived);
}
public Data OnDataRetrived(Data someData)
{
AsyncActionDone(this, new DataEventArgs(someData));
}
}
¿Está el implementador de someObject o se trata de un tipo de biblioteca que no se puede modificar? –
Somos, sin embargo, hay muchos tales objetos. La mayoría de las acciones implican el envío de una solicitud a un servidor y la espera de que el resultado regrese, por lo tanto, por qué son asíncronas por defecto. – Davy8
Tenemos un método para hacer esto para una de nuestras acciones más comunes, almacenar en caché una lista de objetos del servidor, sin embargo eso depende de saber el tipo exacto de objeto y el evento para escuchar. Me gustaría poder pasar en qué evento escuchar para que podamos reducir el código duplicado, ya que las únicas cosas que difieren son el método y el evento que se genera al finalizar. – Davy8