このメソッドは、まだ保存されていない特定の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ドキュメントと何も(これは繰り返しである場合、私は謝罪)上がっています。何が起きているのか?
どのようにこのメソッドを呼び出しますか? 「仕事は決して創造されていない」ことをどのように知っていますか? – dotctor
SaveToDiskは非同期ですか? – Ian
このタスクは、後でSaveImageを呼び出すが起動されていない関数によって作成され、待機しているだけです。私は2つの行を追加しました:saveImageTask = SaveImage(imgFilePath、imageInfo); saveImageTask.Start();だから、浪費者の質問は実際に私にそれを理解させました。 –