Multitrådstöd i e‑postklienter
E‑postklienter som ImapClient och Pop3Client tillåter användare att använda dem i en flertrådad miljö. E‑postklienter kan ha en eller flera anslutningar till en server. För att hantera en uppsättning anslutningar i klienterna används en anslutningspool. Antalet anslutningar som kan skapas och användas samtidigt begränsas av egenskapen CredentialsByHostClient.MaxConnectionsPerServer. Denna egenskap kan sättas till 1 eller ett högre värde. Som standard är värdet 10. En kommandokö har implementerats för anslutningen för att stödja flertrådade operationer. Kommandona implementerar de enklaste operationerna som definieras i protokollet, såsom Noop, Authenticate med mera. Användaren kan påbörja körning av fler kommandon än det finns tillgängliga anslutningar. Men de körs först när klienten kan skapa en anslutning för operationen.
Metoder för att använda e‑postklienter i en flertrådad miljö
E‑postklienter har följande beteende:
1. Om MaxConnectionsPerServer = 1 skapar klienten 1 anslutning, utför autentisering och auktorisation. Denna anslutning hålls aktiv tills klienten avyttras. Alla operationer från olika trådar dirigeras till en gemensam kommandokö i huvudanslutningen.
2. Om MaxConnectionsPerServer > 1 skapar klienten det antal anslutningar som behövs, utför autentisering och auktorisation för varje anslutning. En anslutning reserveras som huvudanslutning. Denna anslutning hålls i aktivt tillstånd tills klienten avyttras. Alla andra anslutningar skapas och avyttras på begäran. Maximal mängd sådana anslutningar definieras av egenskapen MaxConnectionsPerServer, t.ex. om MaxConnectionsPerServer = 2 så reserveras en som huvudanslutning och den andra används som extra för operationer som körs i andra trådar. På liknande sätt, om MaxConnectionsPerServer = 3 så reserveras den första som huvudanslutning och två andra anslutningar används som extra för operationer i andra trådar. Om en ny tråd begär en anslutning och alla anslutningar redan är i bruk, väntar klienten tills antalet använda anslutningar minskar. Detta är ett mycket viktigt moment som förklarar varför korrekt avyttring av anslutningar är så viktig.
Exempel
Användaren kan utföra operationer i olika trådar på flera sätt. De kan delas in i två typer:
1. Användaren använder asynkrona (Begin/End) metoder som definieras i klienten. I detta fall startar e‑postklienten nya trådar vid behov. Klienten har en uppgiftkö (var vänlig, förväxla inte med kommandokö i anslutningen). En uppgift kan utföras om en anslutning är tillgänglig. När antalet använda anslutningar blir mindre än gränsvärdet skapar klienten en ny anslutning, en tråd för den aktuella uppgiften och utför den. Exempel på användning av asynkrona operationer:
2. Användaren kan skapa trådar med objekt som Thread, ThreadPool, Task eller andra avsedda objekt för detta ändamål. Användaren kan också använda trådar skapade i tredjepartskod. Under detta har klienten två beteendemodeller
a. Om användaren inte har skapat extra anslutningar för operationer i tråden, kommer alla operationer för denna tråd att skickas till kommandokön till huvudanslutningen. Ett exempel på operationer i en extra tråd utan att skapa en ny anslutning, alla transaktioner görs via huvudanslutningen:
b. När användaren kör metoden för att skapa en ny anslutning för en extra tråd, blockeras denna tråd tills kvotvärdet för nya anslutningar ändras för att tillåta ny anslutning. Sedan skapas den nya anslutningen. Denna anslutning sätts som standardanslutning för alla operationer i denna tråd. När alla operationer i tråden är slutförda måste anslutningen avyttras. För att skapa nya anslutningar, använd metoden CredentialsByHostClient.CreateConnection. Denna metod returnerar ett objekt som implementerar IDisposable‑gränssnittet. För att frigöra anslutningen måste Dispose‑metoden anropas. Skapande och avyttring av anslutning måste utföras inom den tråd där e‑postoperationer körs. Försök att skapa en ny anslutning i den tråd där e‑postklienten skapades leder till ett fel, eftersom denna tråd för närvarande inte kan användas för att skapa en ny anslutning. Även skapande av ny anslutning är inte möjligt när MaxConnectionsPerServer = 1. Ett kodexempel för att skapa en ny anslutning i en extra tråd:
Rekommendationer
Det är värt att notera att om användaren skickar alla kommandon till huvudanslutningen kan en situation uppstå där kommandon från olika trådar blandas. Användaren bör förstå vilka kommandon som är beroende av deras sekvens och vidta åtgärder för synkronisering av sådana kommandon. Det är också nödvändigt att överväga möjligheten att köra kommandon i olika sessioner (IMAP/POP3). De mest tidskrävande operationerna, såsom FetchMessage, AppendMessage och Send, bör sannolikt utföras med en ny tråd och ny anslutning. Men snabba operationer som Delete bör utföras med huvudanslutningen. Observera att initialisering av en ny anslutning är en tillräckligt tidskrävande operation.