Hier ist der UI-Code. Versuch, die Plattenauslastung für in der Listenansicht angezeigte Dateien und Ordner zu berechnen.C# Wie starte ich eine Methode im Hintergrund? (Verwenden Sie Task.Start nicht Async/Warten)
if (FileHelper.IsFolder(info))
{
UsageSummary usage = DiskUsage.GetTotalUsage(info.FullName).Result;
totalSize += usage.TotalSize;
}
else
{
totalSize += info.Length;
}
Hier ist die GetTotalUsage() -Methode. Die Idee ist, dass es einen zwischengespeicherten Wert zurückgeben sollte, falls verfügbar. Wenn der Wert nicht verfügbar ist, gibt er nur die Größe der Dateien auf der obersten Ebene zurück und startet eine andere Methode, die die Verzeichnisstruktur rekursiv von diesem Punkt abführt und Cache-Einträge erstellt, damit wir das nächste Mal den Ordner aufrufen, den wir bekommen sollten ein zwischengespeicherter Wert
Die letzte Methode ist die Gateway-Methode für die rekursiven Funktionen, die die tatsächliche Größe des Ordners berechnen.
async private static Task AsyncCacheUsage(UsageSummary summary)
{
try
{
AccumulateChildFolders(summary.Folder, summary);
CacheResults(summary);
// Now we start a watch on the volume that
// can invalidate cache entries when changes occur.
_watcher.WatchVolume(summary.Folder);
}
catch (Exception ex)
{
Log.Error(ex, "CacheTotalUsage: {1}", ex.Message);
}
}
Der Code scheint zu funktionieren und verhält sich wie erwartet im Debugger.
Aber meine Frage ist, mache ich das richtig? Die GetTotalUsage-Methode wird einmal für jeden Unterordner in dem Ordner aufgerufen, in dem viele Instanzen von AsynchCacheUsage für alle absteigenden verschiedenen Zweige des Dateisystems angezeigt werden. Was bedeutet, dass ich mich um die Sicherheit der Fäden kümmern muss? Der gesamte Code ist statisch, einschließlich des Zugriffs auf ein statisches Wörterbuch, das die Verwendungen zwischenspeichert, denen ich wahrscheinlich eine Sperre hinzufügen sollte. Irgendwelche anderen Fallen, die ich vermisse?
Es scheint komisch, dass ich "AsyncCacheUsage" anrufe, wenn ich wirklich meine, geh und mach deine Arbeit und störe mich nicht.
Ich denke, Sie sollten eine Warnung für AsyncCacheUsage erhalten. Bist du es und ignorierst du es? –
Nichts in 'AsyncCacheUsage macht 'erwarten', deshalb wird es seinen Thread blockieren. Wahrscheinlich sollte "AccumulateChildFolders" ebenfalls async sein, aber Sie müssen vorsichtig sein, wenn Sie ein als Parameter übergebenes Objekt aktualisieren (ich nehme an, Sie aktualisieren den Parameter 'summary' mit Ergebnissen), da dies * nach * der Funktion aktualisiert wird. Lieber einen Rückgabewert verwenden. – Richard
Beginnt die Asynchronität nicht oben in GetTotalUsage? Dort habe ich vor, dass es beginnt. Ich bekomme nicht die Warnung "Ihre Methode wird synchron ausgeführt" vom Compiler. –