Frage

Ich schreibe eine C # .NET 4.5-Bibliothek, um gemeinsame SQL-Datenbankoperationen zu leisten (Sicherung, Wiederherstellung, Skript usw.). Ich möchte sowohl synchron- als auch asynchrone Funktionen für jeden Vorgang haben, da diese Bibliothek sowohl von Console- als auch von GUI-Apps verwendet wird, aber ich möchte den Code nicht überall doppeln. Also, wie ich es sehe, habe ich zwei Möglichkeiten:

    .
  1. Schreiben Sie den Code, der die Arbeit in einer synchronen Funktion leistet, und wickeln Sie sie dann einfach in eine Aufgabe für die Async-Funktion, wie folgt:

    public void BackupDB(string server, string db)  
    {  
        // Do all of the work and long running operation here  
    }
    
    public async Task BackupDBAsync(string server, string db)  
    {  
        await Task.Factory.StartNew(() => BackupDB(server, db)).ConfigureAwait(false);  
    }
    

  2. Schreiben Sie den Code, der die Arbeit in einer asynchronen Funktion leistet, und nennen Sie sie von einer synchronen Funktion mit .wait ():

    public async Task BackupDBAsync(string server, string db)  
    {  
        // Do all of the work and long running operation here, asynchronously.  
    }
    
    public void BackupDB(string server, string db)  
    {  
        BackupDBAsync(server, db).Wait(); // Execution will wait here until async function finishes completely.  
    }
    

    ist eine Option besser als das andere? Ist eine beste Praxis? Oder gibt es andere (bessere) Alternativen?

    Ich weiß, dass ein Vorbehalte zu verwenden ist .Wait () ist, dass alle erwartenen Anweisungen in der Async-Funktion verwenden müssen .configureAwait (FALSE), um Deadlocks ( wie hier diskutiert ), aber da ich eine Bibliothek schreibe, die niemals auf die Benutzeroberfläche zugreifen muss oder Webcontext, ich bin sicher, das zu tun.

    Ich werde auch darauf hinweisen, dass die SQL-Bibliothek in der Regel auch sowohl synchron- als auch asynchische Funktionen enthält, die verwendet werden können. Wenn also die Arbeit in der Sync-Funktion durchgeführt werden kann, würde ich ihre Synchronisierungsfunktion anrufen, und wenn Sie die Arbeit in der asynchronisieren Funktion, ich würde ihre Async-Funktion anrufen.

    Gedanken / Vorschläge werden geschätzt.

    - edit: Ich habe diese Frage auch gepostet auf den MSDN-Foren hier , um eine offizielle MS-Antwort zu erhalten -

War es hilfreich?

Lösung

Ich möchte sowohl synchron- als auch asynchrone Funktionen für jeden Vorgang haben, da diese Bibliothek sowohl von Konsolen als auch von GUI-Apps verwendet wird, aber ich möchte den Code nicht überall doppeln.

Die beste Antwort lautet: Nicht.

Stephen TOUB verfügt über zwei hervorragende Blog-Beiträge zu diesem Thema:

Andere Tipps

Ich hatte eine ähnliche Situation, in der einige Anwendungen die Daten benötigten, die synchron und andere Asyc geladen wurden.Ich entschied mich für eine Schnittstelle, die ich mein Dataloader angerufen habe: generasacodicetagpre.

Der Rückruf von AssignProjects ist nur ein einfacher Delegierter, der die zurückgegebene Liste der Projekte anzieht: generasacodicetagpre.

Nun, die Schönheit davon ist, dass Sie mit der Schnittstelle arbeiten können, ohne zu wissen, ob Sie sich synchron oder asynchron ausüben.

Drei Klassen werden erstellt: Eine Basis, eine Synchronisation und ein Async: generasacodicetagpre.

Jetzt können Sie in Ihrer Anwendung entscheiden, wie Sie Daten laden möchten ... Dies kann durch einen IOC-Container injiziert werden, ist jedoch für Demo-Zwecke hart codiert: generasacodicetagpre.

Jetzt summiert sich Ihr Anrufcode gleich aus und ist nicht das klügere, ob es asynchron ist oder synchron ist: generasacodicetagpre.

Ich nutze dies regelmäßig für die Einheitsprüfung (Sync), WPF-Anwendungen (Async) und Konsolenanwendungen (Sync).

Es scheint kein Punkt zu sein, um einfach ein Verfahren als asynchron zu markieren, ohne einen erwarten zu verwenden. Markieren, da Async nicht asynchron ist, können Sie erwartet (der Code, der in der Erwartung ausgeführt wird, das ist, was asynchron passiert, und dann wird der Rest der Async-Methode auch asynchron durchgeführt) im Körper der Methode: < / p>

In der Regel, ein von dem ASYNC-Schlüsselwort modifiziertes Verfahren enthält mindestens einen Erwartungsausdruck oder Aussage. Die Methode läuft synchron, bis er den ersten erwartenen Ausdruck erreicht, an welchen Punkt es suspendiert ist, bis die erwartete Aufgabe abgeschlossen ist. Inzwischen wird die Steuerung an den Anrufer der Methode zurückgegeben. Wenn die Methode keinen Erwartungsausdruck oder Anweisung enthält, wird es synchron ausgeführt. Eine Compiler-Warnung weist Sie auf alle Async-Methoden auf, die nicht warten, da diese Situation einen Fehler angeben kann. Weitere Informationen finden Sie unter Compiler-Warnung CS4014.

von: async < / p>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top