Classe Wrapper para carregar Mensagens de Email Assincronicamente usando Aspose.Email

Classe Wrapper para carregar Mensagens de Email

Existem várias ocorrências onde é desejável ter funcionalidade de Timeout para abortar uma ação que está levando um tempo desnecessariamente longo. Este artigo fornece uma classe de exemplo para alcançar a funcionalidade de Timeout ao carregar arquivos EML/MSG que podem levar a atrasos muito longos ou falhar ao carregar. Como o Timeout não está diretamente relacionado a operações de leitura/gravação em disco ou rede, é de pouca utilidade implementar esse recurso dentro da API do que tê-lo implementado no lado do usuário escrevendo uma classe wrapper ao redor do Aspose.

Cancelar uma thread de longa duração pode ser alcançado com o uso de um delegado encapsulado que passa a thread, a ser finalizada, em uma variável local dentro do método que a iniciou. A thread de longa duração é cancelada abortando-a e o controle é retornado à aplicação principal. O seguinte exemplo de código fornece uma classe wrapper em torno da biblioteca Aspose.Email. O código também segue um exemplo de uso da classe wrapper.

Exemplo de Programação com .NET 3.5 e acima

// 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;
}
}

Exemplo de Programação com .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;
}
}

Exemplo 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...");