命名管道停止线程?
Posted
技术标签:
【中文标题】命名管道停止线程?【英文标题】:Named pipe stalls threads? 【发布时间】:2010-05-13 15:18:35 【问题描述】:我正在尝试通过命名管道将更新推送到进程中,但这样做我的进程循环现在会在while ((line = sr.ReadLine()) != null)
上停止。由于这是我第一次涉足命名管道,我对可能出了什么问题感到有些困惑。
void RefreshThread()
using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("processPipe", PipeDirection.In))
pipeStream.WaitForConnection();
using (StreamReader sr = new StreamReader(pipeStream))
for (; ; )
if (StopThread == true)
StopThread = false;
return; // exit loop and terminate the thread
// push update for heartbeat
int HeartbeatHandle = ItemDictionary["Info.Heartbeat"];
int HeartbeatValue = (int)Config.Items[HeartbeatHandle].Value;
Config.Items[HeartbeatHandle].Value = ++HeartbeatValue;
SetItemValue(HeartbeatHandle, HeartbeatValue, (short)0xC0, DateTime.Now);
string line = null;
while ((line = sr.ReadLine()) != null)
// line is in the format: item, value, timestamp
string[] parts = line.Split(',');
// push update and store value in item cache
int handle = ItemDictionary[parts[0]];
object value = parts[1];
Config.Items[handle].Value = int.Parse(value);
DateTime timestamp = DateTime.FromBinary(long.Parse(parts[2]));
SetItemValue(handle, value, (short)0xC0, timestamp);
Thread.Sleep(500);
解决这个问题的方法是让 RefreshThread() 监视一个 Queue<string>
的数据,以及一个单独的线程来处理管道并将通过管道接收到的字符串推送到 Queue<string>
【问题讨论】:
【参考方案1】:这是设计使然,PipeStream.Read() 是一个阻塞调用。您可以改用 BeginRead()。当然,这使得文本不是一种出色的数据格式。不是真正的问题,使用 PipeTransmissionMode.Message。
【讨论】:
【参考方案2】:客户端是否处理其命名管道连接?如果客户端永远不会关闭,您的服务器将永远等待。
【讨论】:
以上是关于命名管道停止线程?的主要内容,如果未能解决你的问题,请参考以下文章