【发布时间】:2013-07-02 10:53:14
【问题描述】:
我正在使用以下代码列出我的命名管道:
private IEnumerable<string> GetNamedPipesList()
{
string[] listOfAllPipes = Directory.GetFiles(@"\\.\pipe\");
return listOfAllPipes.Where(pipe => pipe.Contains("FST"));
}
它工作正常。我可以显示它们:
private void Scan_Click(object sender, EventArgs e)
{
IEnumerable<string> fsbPipes = GetNamedPipesList();
tbxOutput.Text = string.Empty;
foreach (string fsbPipe in fsbPipes)
{
var pipe = fsbPipe.Replace(@"\\.\pipe\", "");
tbxOutput.AppendText(pipe + Environment.NewLine);
}
}
例子:
FST-MT4_Miroslav-130
FST-MT4_Miroslav-150
FST-MT4_Miroslav-120
之后我想通过删除类似文件来关闭它们:
private void CloseAll_Click(object sender, EventArgs e)
{
IEnumerable<string> myPipes = GetNamedPipesList();
foreach (string pipe in myPipes)
{
try
{
File.Delete(pipe);
}
catch (Exception exception)
{
tbxOutput.AppendText(exception.Message + Environment.NewLine);
}
}
}
但它返回参数不正确。我不确定我能做到,但我不得不尝试,因为我将它们作为文件加载。
如何关闭这些命名管道?
【问题讨论】:
-
An instance of a named pipe is always deleted when the last handle to the instance of the named pipe is closed。你真的需要手动关闭它吗?除了
File.Delete(),你还尝试过什么? -
我正在使用管道与第三方软件进行通信。它在关闭后使这些管道保持打开状态。两个应用程序都已关闭,但管道仍然打开。我的用户报告了这种行为,但这是第一次发生在我身上。我正在尝试开发一种工具来重置它们。
-
在您发表评论后,我检查了任务管理器并注意到第三方应用程序未关闭。有两个实例在后台工作。当我手动关闭它们时,其余的命名管道已关闭。这解决了我的问题,使我的问题变得无关紧要。
-
很高兴您发现了这一点。这正是命名管道的行为方式:没有人使用它们,它们消失了。如果 3rdparty 是您的应用程序的“从属”,您可能希望在您的应用程序中包含一个 scanProcessesHandles&killTheProcs。我忘了在答案中提到这一点,但是,现在这可能很明显;)
标签: .net named-pipes