WorldRacer
Erfahrenes Mitglied
Hallo zusammen,
arbeite momentan an einem etwas Umfangreicheren Projekt, nämlich einem EMail-Client mit Organizer und Plugins sowie einer Multi-MEssengerfunktion.
Klappt ja alles soweit so gut. Kurz zum Aufbau: Das Programm verwaltet seine Daten innerhalb einer SQLite Datenbank. D.h. Emails, Accounts, Ordner usw sind in den jeweiligen Tabellen einsortiert. Mails Abrufen und senden funktioniert wunderbar, arbeite mit der OpenPop.NET (hpop) Klasse und der SmtpClient Klasse auss dem Framework.
Folgendes Problem tritt nun auf:
Wenn ich meine Mails aus der Datenbank abrufen will, und in einem bestimmten Ordner (den ich über das Interface anklicke, um die Mails aufzulisten) mehr als, sagen wir 30 Mails, existieren, braucht das Programm bestimmt 3 Sekunden und noch länger für den Abruf und die Auflistung in einer ListView. Das wird für den späteren Benutzer sehr lästig sein. Thunderbird hat das irgendwie besser gelöst, doch die haben ja TextFiles als MailDatenbank, da kann ich mir also nichts abgucken.
Allerdings denke ich schon die Ursache gefunden zu haben. Ich habe meine Verwaltungsklassen (in diesem Fall Classes.Mail.MailDirectory und Classes.Mail.MailMessage) so programmiert, dass beim Abruf eines Attributes eine SQL-Abfrage (SELECT) ausgeführt wird. Da das bei jeder Mail bestimmt 10 Mal vorkommt, habe ich knapp 300 Abfragen in einer Kurzen Zeit. Dazu kommt noch der Abruf der EMail-Liste durch Classes.Mail.MailDirectory->MailsInDirectory, was ebenfalls nochmal 30 Abfragen verursacht. (id der jew. Email wird abgerufen)
Wie kann ich das umgehen? Gibt es Caching-Möglichkeiten ohne dass das Programm gleich wortwörtlich den Arbeitsspeicher mit Rumpf und Stumpf auffrisst?
Gleich hier mal eine kleine Kostprobe eines Attributes:
Vielen Dank schonmal im Voraus!
arbeite momentan an einem etwas Umfangreicheren Projekt, nämlich einem EMail-Client mit Organizer und Plugins sowie einer Multi-MEssengerfunktion.
Klappt ja alles soweit so gut. Kurz zum Aufbau: Das Programm verwaltet seine Daten innerhalb einer SQLite Datenbank. D.h. Emails, Accounts, Ordner usw sind in den jeweiligen Tabellen einsortiert. Mails Abrufen und senden funktioniert wunderbar, arbeite mit der OpenPop.NET (hpop) Klasse und der SmtpClient Klasse auss dem Framework.
Folgendes Problem tritt nun auf:
Wenn ich meine Mails aus der Datenbank abrufen will, und in einem bestimmten Ordner (den ich über das Interface anklicke, um die Mails aufzulisten) mehr als, sagen wir 30 Mails, existieren, braucht das Programm bestimmt 3 Sekunden und noch länger für den Abruf und die Auflistung in einer ListView. Das wird für den späteren Benutzer sehr lästig sein. Thunderbird hat das irgendwie besser gelöst, doch die haben ja TextFiles als MailDatenbank, da kann ich mir also nichts abgucken.
Allerdings denke ich schon die Ursache gefunden zu haben. Ich habe meine Verwaltungsklassen (in diesem Fall Classes.Mail.MailDirectory und Classes.Mail.MailMessage) so programmiert, dass beim Abruf eines Attributes eine SQL-Abfrage (SELECT) ausgeführt wird. Da das bei jeder Mail bestimmt 10 Mal vorkommt, habe ich knapp 300 Abfragen in einer Kurzen Zeit. Dazu kommt noch der Abruf der EMail-Liste durch Classes.Mail.MailDirectory->MailsInDirectory, was ebenfalls nochmal 30 Abfragen verursacht. (id der jew. Email wird abgerufen)
Wie kann ich das umgehen? Gibt es Caching-Möglichkeiten ohne dass das Programm gleich wortwörtlich den Arbeitsspeicher mit Rumpf und Stumpf auffrisst?
Gleich hier mal eine kleine Kostprobe eines Attributes:
Code:
/// <summary>
/// Gets or sets the status of the message. If the message has been read, set it to true.
/// </summary>
public bool IsRead
{
get
{
if (DBConnected)
{
// Init Query and select emails table
DataBase.DataBaseSelectQuery DirectoryQuery = new DataBase.DataBaseSelectQuery("emails");
// Select IsRead-Field
DirectoryQuery.SelectFields(new string[] { "IsRead" });
DirectoryQuery.AddWhereClause("id = '" + EmailID.ToString() + "'");
// Execute the Query.
DataBase.DataBaseResult Result = DataBaseHandler.Query(DirectoryQuery);
return Convert.ToBoolean(Result.ResultSet[0][0].Value);
}
return false;
}
set
{
// [...]
}
}
Vielen Dank schonmal im Voraus!
Zuletzt bearbeitet: