【问题标题】:C# - Synchronous task never being created, causing code to never completeC# - 永远不会创建同步任务,导致代码永远不会完成
【发布时间】:2016-06-24 18:29:19
【问题描述】:

如果尚未保存特定 bmp 图像,则此方法应返回将特定 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 文档,但没有任何结果(如果重复,我深表歉意)。知道发生了什么吗?

【问题讨论】:

  • 这个方法怎么称呼?你怎么知道“任务永远不会被创建”?
  • SaveToDisk 是异步的吗?
  • 该任务后来由一个调用 SaveImage 的函数创建,但它没有被启动,只是等待。我添加了两行: saveImageTask = SaveImage(imgFilePath, imageInfo); saveImageTask.Start();,所以spender的问题实际上让我弄清楚了。

标签: c# asp.net multithreading task msdn


【解决方案1】:

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.");
        });

你不必开始。

【讨论】:

  • 这应该是一条评论。
  • @dotctor ??如果你仔细看,你会发现这是一个答案,不是吗?
  • 该任务后来由一个调用 SaveImage 的函数创建,但它没有被启动,只是等待。我添加了两行:saveImageTask = SaveImage(imgFilePath, imageInfo);saveImageTask.Start();,这行得通! (感谢您的格式化帮助,我是超级新手!)
  • 您试图通过在回答中提出问题来澄清问题。所以this is not an answer 这应该是一条评论。
  • 不,我正在给 OP 一个明确的答案,以两个选项的形式表达。我真的不是要求澄清。抱歉,这让您感到困惑。
【解决方案2】:

你没有开始任务。例如,您需要 saveImageToDiskTask.Start()。您还需要等待它。它必须是一项任务吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多