【问题标题】:C#, Thread, MemoryC#、线程、内存
【发布时间】:2016-11-05 15:43:53
【问题描述】:

今天我想知道如何将图像保存到 Stream(真的在内存中,我可能没有使用适当的术语)并从另一个线程中读取它。

为此,我认为要继续执行以下步骤: A - 在第一个线程中: 1 - 从文件创建图像对象 (System.Drawing) 2 - 创建缩略图 3 - 将缩略图保存到流 (System.IO) 4 - 将 Stream 对象发送到第二个线程。

B - 在第二个线程中: 1 - 从第一个线程接收流 2 - 使用此 Stream 创建 BitmapImage 对象 3 - 在用户界面上显示。 (wpf)

谢谢。

【问题讨论】:

  • 如果 T2 接收的内存与 T1 发送的内存相同,则保存和读取需要一个公共锁对象,这样它们就不会同时发生。
  • 为什么要使用流? A) 1 - 创建图像对象; 2. 将对象发送到第二个线程。 B) 1.接收图像对象; 2. 在用户界面上显示。 (Wpf)
  • @Fabio 我试过这个,但我没有这样做,因为我无法使用 T2 发送的对象。如果你有一个例子来解释我如何做到这一点,你可以告诉我。
  • 你能展示一下代码 - 你如何将流从线程 1 发送到线程 2 吗?
  • 对不起,我已经删除了代码。

标签: c# multithreading memory


【解决方案1】:

我已检索到我的部分代码,我向您展示了我所做的:

在检查我在某些文件夹中的图像的线程中:

public void CreateImgObj(object sender)
{
    try
    {
        FileStream fs = File.Open((string)sender, FileMode.Open);
        Bitmap dImg = new Bitmap(fs);
        MemoryStream ms = new MemoryStream();
        dImg.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        BitmapImage bi_img = new BitmapImage();
        bi_img.BeginInit();
        bi_img.StreamSource = new MemoryStream(ms.ToArray());
        bi_img.EndInit();
        evt_send_img(bi_img);
    }
    catch (Exception e)
    {
        evt_error(e);
    }
}

在 UI 线程中:

    private void img_recieve(object sender)
    {
        try
        {
            Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
                 {
                     items.Add(new Img { Img_In = (BitmapImage)sender });
                 }));
        }
        catch (Exception e)
        {
            messageerreur(e);
        }
    }

注意:“img_recieve”是由“evt_send_img”执行的;

感谢

【讨论】:

  • 除非您试图隐藏错误,否则请不要编码catch (Exception e)
猜你喜欢
  • 2016-02-24
  • 2020-08-08
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2021-05-23
  • 2014-06-21
相关资源
最近更新 更多