此方法应返回一个任务,如果尚未保存特定bmp图像到磁盘,则该任务。
我有一个名为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 :(得分: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.");
});
你不必开始。
答案 1 :(得分:0)
您没有启动任务。例如,您需要saveImageToDiskTask.Start()。你还需要等待它。它必须是一项任务吗?