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() 。您还需要等待它。必须是任务吗?