C#如何将MemoryStream与多线程结合使用

C#如何将MemoryStream与多线程结合使用,c#,multithreading,memorystream,C#,Multithreading,Memorystream,我目前的代码是: public static byte[] ImageToByte(Image img) { byte[] byteArray = new byte[0]; using (MemoryStream stream = new MemoryStream()) { img.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); strea

我目前的代码是:

public static byte[] ImageToByte(Image img)
{

        byte[] byteArray = new byte[0];
        using (MemoryStream stream = new MemoryStream())
        {
            img.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
            stream.Close();
            byteArray = stream.ToArray();
        }


        return byteArray;
}
有什么方法可以让多线程工作,或者使用我的CPU的每个核心
要加快转换速度?

如果要将多个图像转换为字节数组,并且预先知道它们,则可以使用Parallel.ForEach循环,并在那里完成此操作,以便可以在不同的内核中完成(如果可用)。但是我不认为修改这个单一的方法来使用多个内核是值得的,并且可以节省任何时间。

多线程是不可能的。这样做可能会损坏流。 图像必须以零偏移量保存到流中。如果在保存图像之前已将任何附加数据写入流,则流中的图像数据将被损坏


我不知道如何使它使用多核,但要使其线程安全,您需要执行以下操作。首先声明一个私有静态对象

private static readonly Object _obj = new Object();
然后按如下方式修改代码:

public static byte[] ImageToByte(Image img)
{
    lock(_obj)
    {
        byte[] byteArray = new byte[0];
        using (MemoryStream stream = new MemoryStream())
        {
            img.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
            stream.Close();
            byteArray = stream.ToArray();
        }

        return byteArray;
    }
}

尝试使用多线程保存单个流是自找麻烦,我也怀疑这是一个瓶颈,除非您使用Mac,否则我怀疑保存映像所需的时间是否足以保证多线程中的静态方法始终是同步的。此外,对锁定对象的成本存在一种常见的错误认识。它没有那么重要,也不值得保护corruption@edepperson“多线程中的静态方法应该总是同步的”不是真的。公共静态方法应该几乎总是线程安全的。如果他们使用共享数据结构,那么这意味着他们应该使用某种同步。因此,在这方面@edepperson是正确的。BCL中的大多数静态方法都是这样标记的。尽管如此,在这里使用锁是毫无意义的。该方法已经是线程安全的,因为它正在使用新的
MemoryStream
字节[]
。除了作为参数传递的
Image
之外,没有其他共享数据结构。因此,调用者有责任确保不从多个线程访问
Image
。正如Brian Gideon指出的那样,OP编写的方法本质上是线程安全的,因为它除了映像之外不使用任何外部数据,并且由调用方确保映像不受并发更改的影响。