热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:为什么这段代码会在从StreamReader到达第一个ReadLine时挂起?分享

为什么这段代码会在从StreamReader到达第一个ReadLine时挂起?我在第一个arg中将一个大文件传递给下面的SendXMLFile(),但由于它导致手持设备“挂起”“冻

为什么这段代码会在从StreamReader到达第一个ReadLine时挂起?

我在第一个arg中将一个大文件传递给下面的SendXMLFile(),但由于它导致手持设备“挂起”/“冻结”,我暂时硬编码了一个小得多的文件(3 KB而不是1121 KB)用于检测。

该文件确实存在(与.exe / .dll位于同一文件夹中),如下代码所示:

// test with smaller file: fileName = "DSD_v6666_3_20140310140737916.xml"; MessageBox.Show("Made it before file.Open"); using (FileStream fileTest = File.Open(fileName, FileMode.CreateNew)) { fileTest.Write(info, 0, info.Length); fileTest.Flush(); } if (!File.Exists(fileName)) { MessageBox.Show(String.Format("{0} does not seem to exist", fileName)); } else { MessageBox.Show(String.Format("{0} DOES seem to exist", fileName)); } string justFileName = Path.GetFileNameWithoutExtension(fileName); String uri = String.Format(@"http://SHANNON2:21609/api/inventory/sendXML/gus/woodrow/{0}", justFileName).Trim(); SendXMLFile(fileName, uri, 500); 

这是随后调用的代码,尝试发送文件:

 public static string SendXMLFile(string xmlFilepath, string uri, int timeout) { // TODO: Remove after testing String s = String.Format("xmlFilepath == {0}, uri == {1}, timeout == {2}", xmlFilepath, uri, timeout); MessageBox.Show(s); //  

当我运行这个时,我看到:

 "Made it before file.Open" "DSD_v6666_3_20140310140737916.xml DOES seem to exist" [The xmlFilepath, uri, and timout vals expected] "Made it to just before the StreamReader using" "Made it just inside the StreamReader using" 

– 但不是“ line == … ”消息 – 它挂起,我必须热启动设备才能从电子设备中恢复。

StreamReader代码是否存在潜在问题,或者…… ???

UPDATE

我不知道数据中是否存在问题,或者我在代码中必须做出的差异才能使其在Compact Framework中工作。 我有一个非常类似的代码,可以在Winforms应用程序中运行:

 public static string SendXMLFile(string xmlFilepath, string uri, int timeout) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.KeepAlive = false; request.ProtocolVersion = HttpVersion.Version10; request.COntentType= "application/xml"; request.Method = "POST"; StringBuilder sb = new StringBuilder(); using (StreamReader sr = new StreamReader(xmlFilepath)) { String line; while ((line = sr.ReadLine()) != null) { sb.AppendLine(line); } byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString()); if (timeout <0) { request.ReadWriteTimeout = timeout; request.Timeout = timeout; } request.COntentLength= postBytes.Length; try { Stream requestStream = request.GetRequestStream(); requestStream.Write(postBytes, 0, postBytes.Length); requestStream.Close(); //using (var respOnse= (HttpWebResponse)request.GetResponse()) //{ // return response.ToString(); //} // alternate way, safe for older versions of .NET HttpWebResponse respOnse= null; try { respOnse= (HttpWebResponse)request.GetResponse(); } finally { IDisposable disposableRespOnse= response as IDisposable; if (disposableResponse != null) disposableResponse.Dispose(); } } catch (Exception ex) { MessageBox.Show(ex.Message); request.Abort(); return string.Empty; } } } 

&#8212;像这样调用,传递相同的文件作为测试用例:

 private void button20_Click(object sender, EventArgs e) { // Change the file name before each test String fullFilePath = @"C:HoldingTankDSD_v6666_3_20140310140737916.xml"; string justFileName = Path.GetFileNameWithoutExtension(fullFilePath); String uri = String.Format(@"http://localhost:21608/api/inventory/sendXML/su/su/{0}", justFileName); SendXMLFile(fullFilePath, uri, 500); } 

更新2

我改变了代码以使用XMLTextReader,现在我又回到了我以前犯过的错误,即“(400)Bad Request”,这里记录了它的大部分细节。

这是新代码,我现在看到的:

public static bool WriteIt2(string fileName,string data,long fsize){bool retVal = false; int bytRd = 0; //如果使用它,请更改其名称字符串the_Msg =“”;

 if (File.Exists(fileName)) { File.Delete(fileName); } Byte[] info = Encoding.UTF8.GetBytes(data); // Testing with this relatively small file for now fileName = "DSD_v6666_3_20140310140737916.xml"; MessageBox.Show("Made it before file.Open"); using (FileStream fileTest = File.Open(fileName, FileMode.CreateNew)) { fileTest.Write(info, 0, info.Length); fileTest.Flush(); } if (!File.Exists(fileName)) { MessageBox.Show(String.Format("{0} does not seem to exist", fileName)); } // I have never seen the msg above, but always saw the one below, so commented it out else //<= always exists, so unnecessary { MessageBox.Show(String.Format("{0} DOES seem to exist", fileName)); } string justFileName = Path.GetFileNameWithoutExtension(fileName); String uri = String.Format(@"http://SHANNON2:21609/api/inventory/sendXML/su/su/{0}", justFileName).Trim(); SendXMLFile(fileName, uri, 500); 

现在这里是实际执行读取,写入和发送(或尝试)的代码:

 public static string SendXMLFile(string xmlFilepath, string uri, int timeout) { String s = String.Format("xmlFilepath == {0}, uri == {1}, timeout == {2}", xmlFilepath, uri, timeout); MessageBox.Show(s); // "); break; case XmlNodeType.Text: //Display the text in each element. sb.Append (reader.Value); break; case XmlNodeType. EndElement: //Display end of element. sb.Append(""); break; } } // TODO: Remove after testing MessageBox.Show("Made it past the while loop"); MessageBox.Show(String.Format("sb first line is {0}", sb[0].ToString())); MessageBox.Show(String.Format("sb tenth line is {0}", sb[9].ToString())); byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString()); if (timeout <0) { request.Timeout = timeout; } request.COntentLength= postBytes.Length; try { Stream requestStream = request.GetRequestStream(); requestStream.Write(postBytes, 0, postBytes.Length); requestStream.Close(); // This code for older versions of .NET from ctacke: HttpWebResponse respOnse= null; try { respOnse= (HttpWebResponse)request.GetResponse(); return response.ToString(); } finally { IDisposable disposableRespOnse= response as IDisposable; if (disposableResponse != null) disposableResponse.Dispose(); } } catch (Exception ex) { MessageBox.Show(ex.Message); request.Abort(); return string.Empty; } } 

这个运行时我现在看到的是什么:

 0) "Made it before file.Open" 1) "DSD_v6666_3_20140310140737916.xml DOES seem to exist" 2) [ the xmlFilePath and other args - they are what is expected ] 3) "Made it to just before the StreamReader using" 4) "Made it past the StreamReader being constructed 5) "Made it past the while loop 6) "sb first line is "" 8) "The remote server returned an error (400) Bad Request" 

所以至少它不再悬挂,但我又想知道为什么服务器认为这是一个糟糕的请求。

我想你应该回归基础:

 public static string SendXMLFile(string xmlFilepath, string uri, int timeout) { using (var client = new WebClient()) { client.Headers.Add("Content-Type", "application/xml"); byte[] respOnse= client.UploadFile(uri, "POST", xmlFilepath); return Encoding.ASCII.GetString(response); } } 

并查看什么有效以及服务器对您的文件的看法。

当你真的需要TimeOut然后看到这个答案

上述就是C#学习教程:为什么这段代码会在从StreamReader到达第一个ReadLine时挂起?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注&#8212;编程笔记


推荐阅读
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
author-avatar
lksxq_468
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有