代码之家  ›  专栏  ›  技术社区  ›  Jesse Taber

我可以在.NET中从支持进程和取消的磁盘加载映像吗?

  •  0
  • Jesse Taber  · 技术社区  · 5 年前

    我目前正在开发一个.NET桌面应用程序,它将从磁盘加载可能较大的图像。使用 Image.FromFile 工作很好,但由于这些图像可能相当大,我想支持某种形式的进度报告和取消(取消对我来说比进度报告更重要)。

    图像需要加载到内存中,并且不会立即显示在UI控件中,因此使用 PictureBox.LoadAsync/CancelAsync 似乎这不是一个选择(不过如果有办法使用 PictureBox 要加载一个图像而不让它实际出现在父窗体/控件上,我对此持开放态度)。

    Image (通过 Image.FromStream

    我也知道我可以通过 Thread.Abort()

    如何在.NET中完成?

    1 回复  |  直到 5 年前
        1
  •  2
  •   BoldAsLove    5 年前

    你可以试着用 BitmapImage 班级。它有进步和失败/成功的事件。我想如果你用 SetSourceAsync 你可以取消,我还没有玩这么多,但我不知道如果/如何处理多个下载一次。

        2
  •  1
  •   Zer0    5 年前

    也就是说,为什么不使用 Task

    var cts = new CancellationTokenSource();
    var task = Task.Run(() => LotsOfWork(), cts.Token);
    //Causes the task to fail by an exception being thrown
    cts.Cancel();
    

    在理想世界里, LotsOfWork CancellationToken 行动得体。

    private void WrapperMethod(CancellationToken token)
    {
        var currentThread = Thread.CurrentThread;
        using (token.Register(currentThread.Abort))
        {
            YourBlockingMethodHere();
        }
    }
    

    重要提示: Thread.Abort 因为很多原因我都不想谈。

    如果不是,则要中止的线程可能是调用方的线程或线程池线程。这很糟糕。