C# - 永远不会创建同步任务,导致代码永远不会完成

时间:2016-06-24 18:29:19

标签: c# asp.net multithreading task msdn

此方法应返回一个任务,如果尚未保存特定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文档,但没有任何内容发生(如果这是重复,我道歉)。知道发生了什么吗?

2 个答案:

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