Обертка класса для асинхронной загрузки электронных сообщений с использованием Aspose.Email

Обертка класса для загрузки электронных сообщений

Существует множество случаев, когда желательно иметь функциональность тайм-аута для прерывания действия, которое занимает неоправданно длительное время. Эта статья предоставляет пример класса для достижения функциональности тайм-аута при загрузке файлов EML/MSG, что может привести к очень долгим задержкам или неудачной загрузке. Поскольку тайм-аут не является чем-то, что напрямую связано с операциями чтения/записи на диск или в сеть, имеет мало смысла реализовывать эту функцию в API, чем реализовать ее на стороне пользователя, написав класс-обертку вокруг Aspose.

Отмена длительного потока может быть достигнута с использованием обернутого делегата, который передает поток, подлежащий завершению, в локальной переменной внутри метода, который его инициировал. Длительный поток отменяется путем его прерывания, и управление возвращается в основное приложение. Следующий пример кода предоставляет класс-обертку вокруг библиотеки Aspose.Email. Код также демонстрирует пример использования класса-обертки.

Программный пример с .NET 3.5 и выше

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

Программный пример с .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;
}
}

Пример использования

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