Diese Methode sollte einen Task zurückgeben, der ein bestimmtes BMP-Image auf der Festplatte speichert, wenn es noch nicht gespeichert wurde.C# - Synchroner Task wird nie erstellt, wodurch der Code nie vollständig wird
Ich habe ein ConcurrentDictionary namens CachedTileTasks, die Aufgaben, die bereits abgeschlossen wurden, zwischenspeichert und die Bildinformationen als Schlüssel verwendet. Grundsätzlich möchte ich keine Aufgaben starten, die ein bereits gespeichertes Bild speichern.
Das Problem, auf das ich stoße, ist, dass die Aufgabe nie erstellt wird, und der Code stoppt, sobald er versucht, die Aufgabe zu erstellen. Diese Methode wird 9 mal aufgerufen, da 9 Anfragen eingehen - alle Threads werden hier gehalten.
Es kompiliert ohne Fehler und wirft keine Ausnahmen. Mein Code, mit einigen Variablen umbenannt, ist unten:
internal Task SaveImage(String imgFilePath, int encodedImageInfo)
{
Debug.WriteLine("SaveImage called"); // this is being printed
var imageKey = MakeImageKey(encodedImageInfo);
Task saveImageToDiskTask = null;
var foundTask = CachedTileTasks.TryGetValue(imageKey, out saveImageToDiskTask);
// if the task has been cached, it should be copied into saveImageToDiskTask
// if not, the task should remain null
if (foundTask) // you have already done this task
{
// if you've already saved the image to disk, we don't want to return a real task
// so when we execute it, it doesn't take up extra time repeating a task
return null;
}
else // you have not yet done this task, and saveImageToDiskTask should be null
{
// creates image we want to save
var img = new WriteableBitmap(new Uri(imgFilePath));
// this is the last line that it reaches
saveImageToDiskTask = new Task(() =>
{
Debug.WriteLine("Creating the task."); // NOT PRINTING
new ImageExporter().SaveToDisk(img, scale,
TileSize, saveAt, pageNum, user);
Debug.WriteLine("Tiles have been saved to disk.");
});
// cache the task
CachedTileTasks.GetOrAdd(imageKey, saveImageToDiskTask);
// return it
return saveImageToDiskTask;
}
}
Ich habe um Stackoverflow sah und der MSDN-Dokumentation und nichts hat sich (ich entschuldige mich, wenn es sich um eine Wiederholung). Irgendeine Idee was ist los?
Wie nennt man diese Methode? Woher weißt du, dass "die Aufgabe niemals geschaffen wird"? – dotctor
Ist SaveToDisk asynchron? – Ian
Die Aufgabe wird später von einer Funktion erstellt, die SaveImage aufruft, aber sie wurde nicht gestartet, sondern nur abgewartet. Ich habe zwei Zeilen hinzugefügt: saveImageTask = SaveImage (imgFilePath, imageInfo); saveImageTask.Start() ;, also hat mich die Frage des Spenders dazu gebracht, es herauszufinden. –