Clase Wrapper para cargar mensajes de correo electrónico de forma asíncrona usando Aspose.Email

Clase Wrapper para cargar mensajes de correo electrónico

Hay varias ocasiones en las que es deseable tener funcionalidad de tiempo de espera para abortar una acción que está consumiendo un tiempo innecesario. Este artículo proporciona una clase de ejemplo para lograr la funcionalidad de tiempo de espera mientras se cargan archivos EML/MSG que podrían llevar a demoras muy largas o fallar al cargar. Dado que el tiempo de espera no está relacionado directamente con la operación de lectura/escritura en disco o red, es poco útil implementar esta característica dentro de la API que tenerla implementada en el lado del usuario escribiendo una clase wrapper alrededor de Aspose.

Cancelar un hilo que se está ejecutando por mucho tiempo se puede lograr con el uso de un delegado envuelto que pasa el hilo, que debe ser terminado, en una variable local dentro del método que lo inició. El hilo de larga ejecución se cancela abortándolo y el control se devuelve a la aplicación principal. El siguiente ejemplo de código proporciona una clase wrapper de ejemplo alrededor de la biblioteca Aspose.Email. El código también sigue un ejemplo de uso de la clase wrapper.

Ejemplo de programación con .NET 3.5 y superior

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public class WrapperMailMessage
{
private MailMessage msg;
public string strFileName;
public WrapperMailMessage(string strMessageFile)
{
msg = null;
strFileName = strMessageFile;
// Now load the EML file with a timout of 4 seconds
CallWithTimeout(LoadEmlFile, 4000);
}
// Function to load the provided EML file
public void LoadEmlFile()
{
msg = MailMessage.Load(strFileName);
}
// TimeOut function that calls the load EML function with Timeout
public void CallWithTimeout(Action action, int timeoutMilliseconds)
{
Thread threadToKill = null;
Action wrappedAction = () =>
{
threadToKill = Thread.CurrentThread;
action();
};
IAsyncResult result = wrappedAction.BeginInvoke(null, null);
if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
{
wrappedAction.EndInvoke(result);
}
else
{
threadToKill.Abort();
}
}
// This function returns the loaded EML message or NULL in case of unsuccessful load
public MailMessage GetMailMessage()
{
return msg;
}
}

Ejemplo de programación con .NET 2.0

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public class WrapperMailMessage_2_0
{
private MailMessage msg;
public string strFileName;
public WrapperMailMessage_2_0(string strMessageFile)
{
msg = null;
strFileName = strMessageFile;
// Now load the EML file with a timout of 4 seconds
CallWithTimeout(new Action(LoadEmlFile), 4000);
}
// Function to load the provided EML file
public void LoadEmlFile()
{
msg = MailMessage.Load(strFileName);
}
private static void CallWithTimeout(Delegate dlgt, int timeout, params object[] args)
{
ManualResetEvent waitHandle = new ManualResetEvent(false);
Thread t = new Thread(new ThreadStart(delegate
{
dlgt.Method.Invoke(dlgt.Target, args);
waitHandle.Set();
}));
t.Start();
bool bExec = waitHandle.WaitOne(timeout);
if (!bExec)
t.Abort();
}
// This needs to be here as .NET 2.0 doesn't allow argument less calls for this
public delegate void Action();
// This function returns the loaded EML message or NULL in case of unsuccessful load
public MailMessage GetMailMessage()
{
return msg;
}
}

Ejemplo de uso

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Define a wrapper class object and pass the EML file name to load
WrapperMailMessage wrapperObj = new WrapperMailMessage(dataDir + "Message.eml");
// Check if the MailMessage is loaded or NULL
if (wrapperObj.GetMailMessage() != null)
{
MailMessage msg = wrapperObj.GetMailMessage();
Console.WriteLine("Message loaded succesfully::: {0}", msg.Subject);
}
else
Console.WriteLine("Message could not be loaded...");