Asynkrona programmeringsmönster
.NET innehåller tre mönster för att utföra asynkrona åtgärder:
Uppgiftsbaserat Asynkront mönster (TAP) som använder en enda metod för att representera initieringen och slutförandet av en asynkron åtgärd. TAP introducerades i .NET Framework 4. Det är den rekommenderade metoden för asynkron programmering i .NET. Nyckelorden async och await i C# och operatorerna Async och Await i Visual Basic lägga till språkstöd för TAP. Mer information finns i Uppgiftsbaserat Asynkront mönster (TAP).
Händelsebaserat Asynkront mönster (EAP), som är den händelsebaserade äldre modellen för att tillhandahålla asynkront beteende. Det kräver en metod som har suffixet
Async
och en eller flera händelser, händelsehanterardelegattyper ochEventArg
-härledda typer. EAP introducerades i .NET Framework 2.0. Det rekommenderas inte längre för ny utveckling. Mer information finns i Händelsebaserat Asynkront mönster (EAP).APM-mönster (asynkront programmeringsmodell) (kallas IAsyncResult även mönstret), vilket är den äldre modellen som använder IAsyncResult gränssnittet för att tillhandahålla asynkront beteende. I det här mönstret kräver
Begin
synkrona åtgärder ochEnd
metoder (till exempelBeginWrite
ochEndWrite
för att implementera en asynkron skrivåtgärd). Det här mönstret rekommenderas inte längre för ny utveckling. Mer information finns i APM (Asynchronous Programming Model).
Jämförelse av mönster
För en snabb jämförelse av hur de tre mönstren modellerar asynkrona åtgärder bör du överväga en Read
metod som läser en angiven mängd data i en angiven buffert med början vid en angiven förskjutning:
public class MyClass
{
public int Read(byte [] buffer, int offset, int count);
}
TAP-motsvarigheten för den här metoden skulle exponera följande enda ReadAsync
metod:
public class MyClass
{
public Task<int> ReadAsync(byte [] buffer, int offset, int count);
}
EAP-motsvarigheten skulle exponera följande typer och medlemmar:
public class MyClass
{
public void ReadAsync(byte [] buffer, int offset, int count);
public event ReadCompletedEventHandler ReadCompleted;
}
APM-motsvarigheten BeginRead
skulle exponera metoderna och EndRead
:
public class MyClass
{
public IAsyncResult BeginRead(
byte [] buffer, int offset, int count,
AsyncCallback callback, object state);
public int EndRead(IAsyncResult asyncResult);
}