¿Llamado del delegado en el parámetro AsyncState - Pros / Contras? -- # campo con asynchronous campo con delegates camp codereview Relacionados El problema

Putting called delegate into AsyncState parameter - Pros/cons?


2
vote

problema

Español

Tengo la siguiente interfaz:

  public interface ILogger {     void Log(string message, string title, StatusType type, DateTime timestamp);     IAsyncResult LogAsync(string message, string title, StatusType type, DateTime timestamp, AsyncCallback callback);     void EndLogAsync(IAsyncResult result); }   

implementado como registrador basado en archivos ...

  ...      public FileInfo LogFileInfo { get; internal set; }      public void Log(string message, string title, StatusType type, DateTime timestamp)     {         lock (syncObj)         {             CheckLogFileSize(); //rotates LogFileInfo through numbered log files              using (var stream = LogFileInfo.AppendText())             {                 stream.WriteLine(GetFormattedString(message, title, type, timestamp));                 stream.Flush();             }         }     }      public IAsyncResult LogAsync(string message, string title, StatusType type, DateTime timestamp, AsyncCallback callback)     {         var action = new Action<string, string, StatusType, DateTime>(Log);         return action.BeginInvoke(message, title, type, timestamp, callback, action);     }      public void EndLogAsync(IAsyncResult result)     {         ((Action)result.AsyncState).EndInvoke(result);     }   

Observe el parámetro AsyncState de PrincipiNIVOKE; Pasé al delegado a su propia invocación, para que pueda hacerlo referirlo nuevamente en el lado del flip para finalizar la invocación utilizando la misma referencia del delegado que llamé a principiantes.

Las preguntas:

  • ¿Es incluso necesario mantener la referencia real del delegado invocado, o puedo simplemente obtener otra referencia a ese método en el método de EndLogasync?
  • es este un uso aceptable del AsyncState, dado que no tengo otro uso para ello?
Original en ingles

I have the following interface:

public interface ILogger {     void Log(string message, string title, StatusType type, DateTime timestamp);     IAsyncResult LogAsync(string message, string title, StatusType type, DateTime timestamp, AsyncCallback callback);     void EndLogAsync(IAsyncResult result); } 

Implemented as a file-based logger...

...      public FileInfo LogFileInfo { get; internal set; }      public void Log(string message, string title, StatusType type, DateTime timestamp)     {         lock (syncObj)         {             CheckLogFileSize(); //rotates LogFileInfo through numbered log files              using (var stream = LogFileInfo.AppendText())             {                 stream.WriteLine(GetFormattedString(message, title, type, timestamp));                 stream.Flush();             }         }     }      public IAsyncResult LogAsync(string message, string title, StatusType type, DateTime timestamp, AsyncCallback callback)     {         var action = new Action<string, string, StatusType, DateTime>(Log);         return action.BeginInvoke(message, title, type, timestamp, callback, action);     }      public void EndLogAsync(IAsyncResult result)     {         ((Action)result.AsyncState).EndInvoke(result);     } 

Notice the AsyncState parameter of BeginInvoke; I pass the delegate to its own invocation, so that I can reference it again on the flip side to end the invocation using the same delegate reference I called BeginInvoke on.

The questions:

  • Is it even necessary to keep the actual invoked delegate reference around, or can I simply new up another reference to that method in the EndLogAsync method?
  • Is this an acceptable use of the AsyncState, given that I have no other use for it?
        
     
     

Lista de respuestas

1
 
vote

Para responder a su pregunta:

  • Puede acceder a la instancia del delegado leyendo CreateIdentity7 Propiedad (consulte 99887776655443328 Sección de llamando métodos síncronos de manera asíncrona ). Pero será más fácil de almacenar en caché de la instancia del delegado en un campo readonal y usarlo en ambos métodos.
  • Sí, puedes usar AsyncState, como quieras, y algunas veces las personas lo usan para pasar el delegado que se invoca

Tenga en cuenta que está utilizando un hilo separado (en un threadpool) cada vez que escriba algo para iniciar sesión, por lo que habrá una contención entre múltiples hilos si escribe para registrar lo suficiente. Recomendaría el uso de marcos de registro existentes como nlog o log4net para evitar inventar una rueda.

 

To answer your question:

  • you can access the delegate instance by reading ((AsyncResult)asyncResult).AsyncDelegate property (see Executing a Callback Method When an Asynchronous Call Completes section of Calling Synchronous Methods Asynchronously). But it will be easier to cache the instance of the delegate in a readonly field and use it in both methods.
  • yes, you can use AsyncState however you want, and sometimes people use it for passing the delegate being invoked

Note that you're using a separate thread (on a threadpool) each time you write something to log, so there will be contention between multiple threads if you write to log quickly enough. I would recommend using existing logging frameworks like NLog or log4net to avoid inventing a wheel.

 
 

Relacionados problema

2  Amplitud y frecuencias de analizador de sonido  ( Amplitude and frequencies of sound analyser ) 
Como soy principiante con la programación de Mobile / OO, llegué a una situación que me confundió y me hizo preguntarme si estaba codificando correctamente .....

1  Configuración del camino a la barra de herramientasSociadaxIname, con retraso  ( Setting the path to toolbarassociatedxibname with fallback ) 
Tengo algún código que he incluido en un proyecto que quiero liberar. Aquí hay uno de esos bloques: NSString *path = nil; if (delegate && [delegate respond...

6  Método genérico para llamadas de la base de datos  ( Generic method for database calls ) 
Fondo Romper de MVC, he implementado la siguiente arquitectura: POST/GET ➤ PHP ➤ Database Calls ➤ XML ➤ XSLT ➤ HTML Todas las interacciones de la bas...

4  ¿Algo que me esté perdiendo en esta implementación del delegado?  ( Anything im missing on this delegate implementation ) 
Justo cuando la pregunta dice y para estar segura, ¿estoy perdiendo algo en esto? ¿Algo importante / obvio que me pasa por alto? Como es, puedo guardar cualqu...

4  Implementación de la débula  ( Weakaction implementation ) 
Aquí está mi primer intento de crear una débilización utilizando expresiones y delegados. Me gustaría que quede claro que este código fue escrito después de l...

3  Eliminar a todos los delegados de un despachador de eventos  ( Removing all delegates from an event dispatcher ) 
Dada una clase, que es un despachador de eventos cuya tienda subyacente es un diccionario de eventos cuya clave es el tipo de evento 9988776655544339 , es la...

5  Prueba de unidad si se ha elevado o no un evento  ( Unit test if an event has been raised or not ) 
Dado el siguiente código de despachador de eventos public interface IApplicationEvent { } public delegate void ApplicationEventHandlerDelegate<in TEvent>(...

6  ¿Está mi delegado definió la forma correcta y necesita transformarse en una mariposa bonita?  ( Is my delegate defined the right way and does it need to transform to a pretty e ) 
He leído tantos Historias de tiempo de cama e inserciones de cómo < fuertes> delegados trabajo y por qué eventos deben ser reemplazados por los delegado...

5  Cola de mensajes de consumo múltiple de múltiples productores sin bloqueo  ( Lock free multiple producer single consumer message queue ) 
Por un tiempo ahora he estado después de una implementación gratuita, simple y escalable de un productor múltiple, una sola cola de consumo para los delegados...

7  Usando delegados para evitar la creación duplicada de recursos  ( Using delegates to avoid duplicate creation of resources ) 
Estoy escribiendo un PCL que usa un 9988776665544330 para ir a visitar algunos sitios y extraer datos de ellos. Mi código inicial se veía así: public sta...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos