Tag: 内存流

异步内存流方式:以下哪项?

我正在研究使用异步内存流的解决方案,我正在考虑实现这种方法的正确方法。 哪一个比较方便? 第一个,简单: //First approach: linear async private async static Task WriteToStreamFirstVariant() { MemoryStream memoryStream = new MemoryStream(); byte[] data = new byte[256]; try { await memoryStream.WriteAsync(data, 0, data.Length); } catch(Exception exception) { //Handling exception } finally { memoryStream.Dispose(); } } 或者第二个嵌套任务和闭包? //Second approach: nested tasks async private async static Task WriteToStreamSecondVariant() { await Task.Run(async […]

MemoryStream来自bytes数组,具有不同类型的数据

我想创建一个包含int32,int16,单值的内存流。 使用二进制文件是没用的,所以我试图创建字节数组。 因为值是不同的类型,我不知道如何正确地做到这一点。 所以我尝试这样做: byte[] tab = new byte[]{2,0,0,0,3,0,3,0} – 2是int32(四个字节),另外两个3是int16(两个字节) 这工作正常,但是当我想添加一些单个值时,它会产生错误。 我不能这样做: byte[] tab = new byte[]{2,0,0,0,3,0,3,0,4.4f,5.6f} 我必须有正确格式的流,因为这个流将在这个方法中读取: short[] rawData; float[] modulusData; public void rawData(Stream s) { BinaryReader br = new BinaryReader(s); int dataCount = br.ReadInt32(); if (dataCount > 0) { rawData = new short[dataCount]; for (int i = 0; i 0) { modulusData […]

访问MemoryStream的不同线程

有一些代码通过调用GetBuffer()将数据直接写入MemoryStream对象的数据缓冲区。 它还适当地使用和更新Position和SetLength()属性。 此代码在99.9999%的时间内正常工作。 从字面上看。 只有每隔几十万次的迭代它才会出现。 具体问题是MemoryStream的Position属性突然返回零而不是适当的值。 但是,添加了检查0的代码并抛出exception,其中包括在单独的方法中记录MemoryStream属性(如位置和长度)。 那些返回正确的值。 在同一方法中进一步添加日志记录表明,当出现这种罕见情况时,Position在此特定方法中仅为零。 好的。 显然,这必须是一个线程问题。 而且很可能是编译器优化问题。 但是,这个软件的本质是它由调度程序的“任务”组织,因此几个实际的操作系统线程中的任何一个都可以在任何给定时间运行此代码 – 但一次不得超过一个。 所以我的猜测通常会发生同样的线程不断用于此方法,然后在极少数情况下使用不同的线程。 (只需编写想法,通过捕获和比较线程ID来测试这个理论。) 然后由于编译器优化,不同的线程永远不会得到正确的值。 它得到一个“陈旧”的价值。 通常在这种情况下,我会将“volatile”关键字应用于相关变量,以查看是否可以修复它。 但在这种情况下,变量位于MemoryStream对象中。 有没有人有任何其他想法? 或者这是否意味着我们必须实现自己的MemoryStream对象? 真诚的,韦恩 编辑:只运行一个测试,计算此方法的调用总数,并计算ManagedThreadId与上次调用的次数不同的次数。 它几乎完全是50%的时间切换线程 – 在它们之间交替。 所以我上面的理论几乎肯定是错的,或者错误会更频繁地发生。 编辑:这个错误很少发生,它需要将近一个星期没有错误运行之前感到有任何信心,它真的消失了。 相反,最好运行实验来确切地确定问题的本质。 编辑:当前锁定是通过使用MemoryStream的5种方法中的每一种中的lock()语句来处理的。

将位图保存到MemoryStream中

我应该分配内存还是只分配内存流的对象:这样可以吗? MemoryStream memoryStream = new MemoryStream(); bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); 如果我需要定义MemoryStream大小,我如何从Bitmap获取它?

位图byte 的大小与BMP内存流大小不同

我试图通过tcp / ip连接发送位图。 到目前为止,我的程序工作正常。 但在调试过程中,我发现了我的位图byte []的奇怪值。 我打开一个24位位图并将其转换为16位。 位图是800×600所以字节[]长度应该是800 * 800 * 2Byte = 960000Byte …但我的数组是960054 … 额外的字节来自哪里? Console.WriteLine(“Bitmap auf 16Bit anpassen…\n”); Rectangle r = new Rectangle(0,0,bitmap_o.Width, bitmap_o.Height); Bitmap bitmap_n = bitmap_o.Clone(r, PixelFormat.Format16bppRgb555); bitmap_n.Save(“test2.bmp”); Console.WriteLine(“Neue Bitmap-Eigenschaften:”); Console.WriteLine(bitmap_n.Width.ToString()); Console.WriteLine(bitmap_n.Height.ToString()); Console.WriteLine(bitmap_n.PixelFormat.ToString()); byte[] data = new byte[0]; MemoryStream mem_stream = new MemoryStream(); bitmap_n.Save(mem_stream, ImageFormat.Bmp); data = mem_stream.ToArray(); mem_stream.Close(); Console.WriteLine(data.Length.ToString()); […]

iTextSharp正在使用Response生成损坏的PDF

我试过两个,但仍然没有工作 iTextSharp + FileStream =损坏的PDF文件 iTextSharp正在生成一个损坏的PDF using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream()) { //abre o documento para poder editar document.Open(); //Adiciona os campos de assinatura document.Add(Assinatura()); //fecha o documento ao finalizar a edição document.Close(); //Prepara o download byte[] bytes = memoryStream.ToArray(); memoryStream.Close(); Response.Clear(); Response.ContentType = “image/pdf”; //Response.ContentType = “application/pdf”; Response.AddHeader(“Content-Disposition”, “attachment; filename=ControleDePonto.pdf”); Response.Buffer = true; […]

如何使用P / Invoke将MemoryStream数据传递给非托管C ++ DLL

我需要您的帮助以下方案: 我正在从硬件读取一些数据到MemoryStream(C#),我需要将这些数据在内存中传递给在非托管C ++中实现的dll(使用指针??)。 读取的数据(流入)非常大(兆字节)。 我知道我可以P / Invoke这个dll,但我不确定如何将流数据的指针/引用传递给C ++ API? 我必须承认我很困惑,因为我是C#的新手 – 我需要使用unsafe / fixed,因为数据很大或者这些是不相关的,因为MemoryStream对象是由GC管理的吗? 一些示例代码/详细描述将非常有用。 谢谢 非托管API的签名: BOOL doSomething(void * rawData,int dataLength)

Image.FromStream()方法返回Invalid Argumentexception

我正在从智能相机成像器捕获图像并通过套接字编程从相机接收字节数组(.NET应用程序是客户端,相机是服务器)。 问题是我在运行时得到System.InvalidArgumentexception。 private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { MemoryStream ms = new MemoryStream(byteArray); return Image.FromStream(ms, false, false); /*last argument is supposed to turn Image data validation off*/ } return null; } 我在许多论坛上搜索过这个问题,并尝试了许多专家给出的建议,但没有任何帮助。 我不认为字节数组有任何问题,因为当我将相同的字节数组输入我的VC ++ MFC客户端应用程序时,我得到了图像。 但这在C#.NET中不起作用。 谁能帮我 ? PS: 我试图完成同样任务的其他方法是: 1。 private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { MemoryStream ms […]