2016-06-24 7 views
1

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?

+0

Wie nennt man diese Methode? Woher weißt du, dass "die Aufgabe niemals geschaffen wird"? – dotctor

+0

Ist SaveToDisk asynchron? – Ian

+0

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. –

Antwort

2

erstellt eine nicht gestartete Aufgabe. Meinst Du Task.Run? Oder meinst du vielleicht saveImageToDiskTask.Start()?

Die Antwort ist, dass Sie new Task verwendet haben, die Ihnen eine kalte Aufgabe gibt, die gestartet werden muss.

saveImageToDiskTask.Start() 

wird dies für Sie tun, oder alternativ können Sie eine heiße Aufgabe Rascheln von Task.Run mit:

Task.Run(() => 
     { 
      Debug.WriteLine("Creating the task."); // NOT PRINTING 

      new ImageExporter().SaveToDisk(img, scale, 
       TileSize, saveAt, pageNum, user); 

      Debug.WriteLine("Tiles have been saved to disk."); 
     }); 

, die Sie nicht von vorn anfangen.

+0

Dies sollte ein Kommentar sein. – dotctor

+0

@dotektor ?? Wenn du genau hinsiehst, wirst du sehen, dass es eine Antwort ist, oder? – spender

+0

Die Aufgabe wird später von einer Funktion erstellt, die SaveImage aufruft, aber sie wurde nicht gestartet, sondern nur erwartet. Ich habe zwei Zeilen hinzugefügt: 'saveImageTask = SaveImage (imgFilePath, imageInfo);' 'saveImageTask.Start();', was funktioniert hat! (Danke für die Formatierungshilfe, ich bin super neu!) –

0

Sie starten die Aufgabe nicht. Sie benötigen beispielsweise saveImageToDiskTask.Start(). Sie müssen auch darauf warten. Muss es eine Aufgabe sein?