- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试做的事情的快速序言。我想启动一个进程并启动两个线程来监视 stderr 和 stdin。每个线程咀嚼流的位,然后将其发送到 NetworkStream。如果任一线程出现错误,则两个线程都需要立即死亡。
这些带有 stdout 和 stdin 监控线程的进程中的每一个都由一个主服务器进程分离出来。这变得棘手的原因是因为在任何给定时间很容易有 40 或 50 个这样的过程。只有在早上重启突发时才会有超过 50 个连接,但它确实需要能够处理 100 个或更多。我测试了 100 个同时连接。
try
{
StreamReader reader = this.myProcess.StandardOutput;
char[] buffer = new char[4096];
byte[] data;
int read;
while (reader.Peek() > -1 ) // This can block before stream is streamed to
{
read = reader.Read(buffer, 0, 4096);
data = Server.ClientEncoding.GetBytes(buffer, 0, read);
this.clientStream.Write(data, 0, data.Length); //ClientStream is a NetworkStream
}
}
catch (Exception err)
{
Utilities.ConsoleOut(string.Format("StdOut err for client {0} -- {1}", this.clientID, err));
this.ShutdownClient(true);
}
此代码块在一个当前不是后台的线程中运行。 StandardError 流有一个类似的线程。我正在使用这种方法而不是监听 OutputDataReceived 和 ErrorDataReceived,因为 Mono 中存在一个问题,导致这些事件并不总是正确触发,即使它现在似乎已修复,我喜欢这种方法确保我正在读写所有内容顺序。
带有 True 的 ShutdownClient 只是试图杀死两个线程。不幸的是,我发现使这项工作起作用的唯一方法是在 stdErrThread 和 stdOutThread 对象上使用中断。理想情况下,peek 不会阻塞,我可以只使用手动重置事件来继续检查 stdOut 或 stdIn 上的新数据,然后在事件翻转时死掉。
我怀疑这是最好的方法。有没有办法在不使用中断的情况下执行此操作?
我想更改,因为我刚刚在日志中看到我错过了 Utlities.ConsoleOut 中抛出的 ThreadInterruptException。如果静态变量为真,这只会执行 System.Console.Write,但我猜这会在某处阻塞。
编辑:
这些线程是父线程的一部分,由服务器根据请求启动。因此我无法将 StdOut 和 StdErr 线程设置为后台并终止应用程序。我可以从主服务器中终止父线程,但这又会因 Peek 阻塞而变得棘手。
添加了关于这是服务器的信息。
我也开始意识到更好的查询队列方法可能是最终的解决方案。
最佳答案
我可以说这整个困惑源于 Peek
阻塞这一事实。您实际上是在尝试修复框架中从根本上被破坏的东西,而且这绝非易事(即不是肮脏的黑客)。就个人而言,我会解决问题的根源,即阻塞 Peek
。 Mono 会遵循 Microsoft 的实现,因此最终会遇到同样的问题。
虽然我确切地知道如果允许我更改框架源代码如何解决问题,但解决方法是漫长且耗时的。
但是这里是。
从本质上讲,Microsoft 需要做的是更改 Process.StartWithCreateProcess
,以便为 standardOutput
和 standardError
都分配一个特殊类型的 StreamReader
(例如 PipeStreamReader
)。
在这个 PipeStreamReader
中,他们需要覆盖两个 ReadBuffer
重载(即需要首先在 StreamReader
中将两个重载更改为虚拟),这样在读取之前,调用 PeekNamedPipe
进行实际的查看。目前,FileStream.Read()
(由 Peek()
调用)将在没有数据可供读取时阻塞管道读取。虽然 0 字节的 FileStream.Read()
在文件上运行良好,但在管道上运行不佳。事实上,.NET 团队遗漏了管道文档的重要部分 - PeekNamedPipe WinAPI。
The PeekNamedPipe function is similar to the ReadFile function with the following exceptions:
...
The function always returns immediately in a single-threaded application, even if there is no data in the pipe. The wait mode of a named pipe handle (blocking or nonblocking) has no effect on the function.
如果框架中没有解决这个问题,目前最好的办法是推出您自己的 Process 类(围绕 WinAPI 的薄包装器就足够了)。
关于c# - StreamReader.Peek 和 Thread.Interrupt 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557591/
我有 PriorityQueue 使用示例,它产生 3 1 1 1 5 0 这是代码 import java.util.*; class Someclass { public static class
这个问题在这里已经有了答案: Help: ZX81 BASIC "Peek" function (3 个回答) 7年前关闭。 我需要一种方法来查找字符 ('即将移动,然后阅读 LET C= PEEK(
在 Facebook 应用程序中,如果您“偷看”相册中的一张照片,您可以水平滑动手指以转到其他照片。 这是如何在 API 中完成的?我所看到的只是提供一个 View Controller 并在弹出时提
我对MassTransit使用者是否可以在实际检索msg之前可以Peek()一个MSMQ队列感到好奇。 步骤/过程是什么: 1)消息已发送到队列 2)消费者获取它并必须进行数据库更新-大约需要5秒钟
我从 Microsoft docs 了解到在第一个 Peek() 操作期间,任何一个可用的消息代理都会响应并发送其最旧的消息。然后在后续的 Peek() 操作中,我们可以遍历分区来查看序列号增加的每条
嗨,我正在尝试查看队列,但编译器不断抛出找不到符号错误。 public class HelloWorld{ interface Queue { Queue enqueue(T ele); T dequ
我在循环中遇到了各种场景,在迭代处理项目时我会向前“查看”或“跳过”。 一种情况是我正在枚举文件的行,并且行末尾有一个“继续”字符,指示将下一行与当前行合并。如果我只是简单地循环,这并不太难,我可以读
首先,我想说如果有人能在这里提供帮助,你真是太棒了。 一般问题 我的Python程序需要与MSMQ交互。基本上,我想查看队列,如果队列中没有任何内容,则指定超时。 但是,尽管我尽了最大努力,当队列中先
我正在学习 C 和 C#,这个问题是针对 C# 的。我有这个 while 循环,它导致无限循环。我以前用过这个,它总是很好用。但现在它只是永远循环,永远不会退出。我正在执行此 while 循环以计算文
我在从文件中读取输入时遇到了一些问题,我真的不应该在家庭作业中遇到这些问题。我在之前的上一次分配中使用了非常相似的代码(唯一改变的是值被插入的地方)。我得到了一个包含以下输入的文本文件: 10 3 6
istream& operator>>(istream& s, vector& ord) { string c{}; bool got_customer = false; Cu
Eventfd维护一个 uint64_t 计数器,每次写入时都会增加,每次读取时都会重置为零(如果用作 EFD_SEMAPHORE,则减 1)。是否可以在不更改 eventfd 内部计数器值的情况下查
假设我有一个外部 while 循环来读取每个字符并将其输出到控制台。如果找到一个词,我还想标记它,通过使用 peek 方法,我可以找到一个词的第一个实例。有没有办法窥视前方的多个地方。例如,如果我要查
LinkedList 具有方便的peek、pop、...方法。 不幸的是,我需要一个线程安全的LinkedList。所以,我的第一个想法是将其包装如下: List list = Collections
对于我的应用程序,某些 fragment 要求用户在显示之前在对话框中输入 PIN。我有一个 BaseFragment 类,如果需要 pin,我的所有其他 fragment 都会扩展该类。我现在的问题
我的问题以最简单的方式表达: 根据 JavaDoc : Peek() method exists mainly to support debugging, where you want to see
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
本文将介绍 Stream.peek 方法示例。 peek 方法返回包含该流元素的流,并对每个元素执行提供的 Consumer 操作。 peek 是一个中间操作。从 Java 文档中查找 peek 方法
这似乎应该很容易做到,但是每次我处理这个问题时,我最终都会得到感觉“不太优雅”的解决方案 这是我的基本问题:如果我正在循环浏览以特定方式订购的字典,在循环中的任何给定点内,我如何“查看”或获得对当前位
List nums = Arrays.asList(1,2,3,4,5,6); long result = nums .stream() .peek(System.ou
我是一名优秀的程序员,十分优秀!