2016-06-24 13 views
1

このメソッドは、まだ保存されていない特定のbmpイメージをディスクに保存するタスクを返します。C# - 同期タスクが作成されず、コードが決して完了しない

イメージ情報をキーとして、すでに完了しているタスクをキャッシュするCachedTileTasksというConcurrentDictionaryがあります。基本的には、すでに保存されている画像を保存するタスクを開始したくありません。

私が問題になっているのは、タスクが作成されることはないということです。タスクを作成しようとするとすぐにコードは停止します。このメソッドは、9回のリクエストがあるので、9回呼び出されます。すべてのスレッドがここに保持されます。

エラーなしでコンパイルされ、例外は発生しません。名前を変更したいくつかの変数を持つ私のコードは、以下の通りです:

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; 

     } 
    } 

私はStackOverflowの周りを見てきたとMSDNドキュメントと何も(これは繰り返しである場合、私は謝罪)上がっています。何が起きているのか?

+0

どのようにこのメソッドを呼び出しますか? 「仕事は決して創造されていない」ことをどのように知っていますか? – dotctor

+0

SaveToDiskは非同期ですか? – Ian

+0

このタスクは、後でSaveImageを呼び出すが起動されていない関数によって作成され、待機しているだけです。私は2つの行を追加しました:saveImageTask = SaveImage(imgFilePath、imageInfo); saveImageTask.Start();だから、浪費者の質問は実際に私にそれを理解させました。 –

答えて

2

new Taskは、起動されていないタスクを作成します。 Task.Runを意味しましたか?または、おそらく saveImageToDiskTask.Start()を意味しましたか?

答えは、あなたがあなたを開始する必要が冷たいタスクを与えるnew Taskを使用しているということです。

saveImageToDiskTask.Start() 

はあなたのためにこれを行います、あるいは、あなたがTask.Runを使用して、ホットタスクをさらさらすることができます:あなたはありません

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."); 
     }); 

を開始します。

+0

コメントです。 – dotctor

+0

@dotctor ??あなたが慎重に見れば、それは答えなのでしょうか? – spender

+0

このタスクは、後でSaveImageを呼び出すが、起動されていない、待たされていた関数によって作成されます。私は2つの行を追加しました: 'saveImageTask = SaveImage(imgFilePath、imageInfo);' 'saveImageTask.Start();'! (書式化の助けをありがとう、私は新しいスーパーです!) –

0

タスクを開始しません。たとえば、saveImageToDiskTask.Start()が必要です。それを待つ必要もあります。それは仕事でなければならないのですか?

関連する問題