C# - 永远不会创建同步任务,导致代码永远无法完成
C# - Synchronous task never being created, causing code to never complete
此方法应该 return 将特定 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;
}
}
我查看了 Whosebug 和 msdn 文档,但没有找到任何结果(如果重复,我深表歉意)。知道发生了什么事吗?
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.");
});
您不必开始。
您没有开始任务。例如,您需要 saveImageToDiskTask.Start() 。您还需要等待它。必须是任务吗?
此方法应该 return 将特定 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;
}
}
我查看了 Whosebug 和 msdn 文档,但没有找到任何结果(如果重复,我深表歉意)。知道发生了什么事吗?
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.");
});
您不必开始。
您没有开始任务。例如,您需要 saveImageToDiskTask.Start() 。您还需要等待它。必须是任务吗?