Start async-Methode als Thread oder als Aufgabe

Ich bin neu C#s await/async und derzeit spielen Sie ein bisschen herum.

In meinem Szenario habe ich eine einfache client-Objekt, das hat eine WebRequest Eigenschaft. Der Kunde sollte senden Sie in regelmäßigen Abständen alive-Nachrichten über die WebRequests RequestStream.
Dies ist der Konstruktor des client-Objekts:

public Client()
{
    _webRequest = WebRequest.Create("some url");
    _webRequest.Method = "POST";

    IsRunning = true;

    //--> how to start the 'async' method (see below)
}

und die async-lebendig-sender-Methode

private async void SendAliveMessageAsync()
{
    const string keepAliveMessage = "{\"message\": {\"type\": \"keepalive\"}}";
    var seconds = 0;
    while (IsRunning)
    {
        if (seconds % 10 == 0)
        {
            await new StreamWriter(_webRequest.GetRequestStream()).WriteLineAsync(keepAliveMessage);
        }

        await Task.Delay(1000);
        seconds++;
    }
}

Wie sollte die Methode gestartet werden?

neuen Thread(SendAliveMessageAsync).Start();

oder

Aufgabe.Run(SendAliveMessageAsync); //änderung der Rückgabe-Typ zu Aufgabe

oder

erwarten SendAliveMessageAsync(); //schlägt fehl, da der Konstruktor ist nicht async

Meine Frage ist, mehr über mein persönliches Verständnis von await/async ich glaube, das ist vielleicht falsch in einigen Punkten.

Die Dritte Möglichkeit ist, werfen

The 'await' operator can only be used in a method or lambda marked with the 'async' modifier
Zuerst müssen Sie entscheiden, ob dies ist ein Feuer-and-forget-Methode oder etwas, das Sie warten möchten.
Es ist in der Tat ein Feuer-und-vergessen werden, da es einfach starten sollte ein Thread senden alive-Meldungen.
Dann await ist sinnlos, da man nicht wirklich daran interessiert, zu warten, für Sie zu vervollständigen. Ich würde einfach den thread Ansatz dann. Persönlich halte ich Aufgaben wie kleinere enthaltenen Einheiten von Arbeit, die ausgeführt werden muss asynchron.
Sie sollten nie nennen new StreamWriter(_webRequest.GetRequestStream()).WriteLineAsync(keepAliveMessage) - erwarten-oder anders - als StreamWriter ist IDisposable und müssen ordnungsgemäß entsorgt werden, sobald verwendet. Diese syntax ermöglicht es Ihnen nicht zu nennen .Dipose().
Gut und gültig-Punkt. Aber dies ist nicht der funktionierende code. Die StreamWriter ist auch die Initialisierung im Konstruktor, sondern wird der Einfachheit halber hier nicht gezeigt.

InformationsquelleAutor KingKerosin | 2016-01-15

Schreibe einen Kommentar