Aszinkron programozási minták
A .NET három mintát biztosít az aszinkron műveletek végrehajtásához:
Feladatalapú aszinkron minta (TAP), amely egyetlen metódust használ egy aszinkron művelet elindításának és befejezésének ábrázolására. A TAP a .NET-keretrendszer 4-ben jelent meg. Ez az aszinkron programozás ajánlott megközelítése a .NET-ben. A C# aszinkron és várakozási kulcsszavai, valamint az Async és await operátorok Visual Basic nyelvi támogatást nyújtanak a TAP-hoz. További információ: Feladatalapú aszinkron minta (TAP).
Eseményalapú aszinkron minta (EAP), amely az aszinkron viselkedést biztosító eseményalapú örökölt modell. Olyan metódust igényel, amely utótagot
Async
és egy vagy több eseményt, eseménykezelő delegálási típust ésEventArg
-származtatott típust használ. Az EAP a .NET-keretrendszer 2.0-s verzióban jelent meg. Az új fejlesztéshez már nem ajánlott. További információ: Eseményalapú aszinkron minta (EAP).Aszinkron programozási modell (APM) minta (más néven IAsyncResult minta), amely az aszinkron viselkedést az interfészt használó IAsyncResult örökölt modell. Ebben a mintában a szinkron műveletekhez és
End
metódusokhoz (példáulEndWrite
BeginWrite
egy aszinkron írási művelet implementálásához) van szükségBegin
. Ez a minta már nem ajánlott az új fejlesztéshez. További információ: Aszinkron programozási modell (APM).
Minták összehasonlítása
A három minta aszinkron műveleteinek gyors összehasonlításához fontolja meg azt Read
a módszert, amely egy megadott mennyiségű adatot olvas be egy megadott pufferbe egy megadott eltolástól kezdve:
public class MyClass
{
public int Read(byte [] buffer, int offset, int count);
}
A metódus TAP megfelelője a következő egyetlen ReadAsync
metódust teszi elérhetővé:
public class MyClass
{
public Task<int> ReadAsync(byte [] buffer, int offset, int count);
}
Az EAP-megfelelő a következő típusokat és tagokat teszi elérhetővé:
public class MyClass
{
public void ReadAsync(byte [] buffer, int offset, int count);
public event ReadCompletedEventHandler ReadCompleted;
}
Az APM-megfelelő a következő módszereket és EndRead
módszereket teszi közzéBeginRead
:
public class MyClass
{
public IAsyncResult BeginRead(
byte [] buffer, int offset, int count,
AsyncCallback callback, object state);
public int EndRead(IAsyncResult asyncResult);
}