- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用命名管道在 Windows 服务和 WPF 应用程序之间进行通信,两者都是用 VB.Net 编写的。 Windows 服务一直在运行。
但是,在运行 WPF 应用程序几个小时后,将引发 StackOverflowException
。
PipeServerThread()
是唯一在异常发生时在托管堆栈中重复调用的函数(我使用 WinDbg
对此进行了追踪)。
服务包含NamedPipeClientStream
,应用包含NamedPipeServerStream
。
当客户端和服务器通信时,服务器在经过几次检查后读取最终的客户端响应,然后将客户端字符串传递给代码中其他地方的函数。
管道服务器随后被冲洗、关闭和处置。
然后再次调用 PipeServerThread()
以创建另一个用于通信的管道服务器。请注意此 PipeServerThread() 被重复调用。
谁能阐明代码中最终导致 StackOverflowException
发生的原因?
管道服务器:
Dim PipeServers(1) As Thread
PipeServers(1) = New Thread(AddressOf PipeServerThread)
PipeServers(1).IsBackground = True
PipeServers(1).Start()
Private Sub PipeServerThread()
Dim ps = New System.IO.Pipes.PipeSecurity
Try
ps.AddAccessRule(New System.IO.Pipes.PipeAccessRule("Users", System.IO.Pipes.PipeAccessRights.FullControl, System.Security.AccessControl.AccessControlType.Allow))
ps.AddAccessRule(New System.IO.Pipes.PipeAccessRule("CREATOR OWNER", System.IO.Pipes.PipeAccessRights.FullControl, System.Security.AccessControl.AccessControlType.Allow))
ps.AddAccessRule(New System.IO.Pipes.PipeAccessRule("SYSTEM", System.IO.Pipes.PipeAccessRights.FullControl, System.Security.AccessControl.AccessControlType.Allow))
Dim pipeserver = New System.IO.Pipes.NamedPipeServerStream("testpipe", Pipes.PipeDirection.InOut, 10, Pipes.PipeTransmissionMode.Byte, Pipes.PipeOptions.None, 4024, 4024, ps)
Debug.WriteLine("Pipeserver waiting for connection")
pipeserver.WaitForConnection()
Try
'Debug.WriteLine("Pipeserver now within Try block.")
Dim ss As New StreamString(pipeserver)
'This server writes to pipe immediately on connection
Debug.WriteLine("Server now writing to Pipe")
ss.WriteString("Hello Client. Who are you?") 'Action 1 - server writes to Pipe
'Response from client is read
Dim ClientName As String = ss.ReadString 'Action 4 - server reads from Pipe
Debug.WriteLine("Client's name is: " & ClientName)
If ClientName = "PipeWriterService" Then
'The client is the PipeWriterService
'Tell it what state is being requested
ss.WriteString(RequestedCommState) 'Action 5 (if) - server writes to Pipe
Else
'The client is someting else
ss.WriteString("wrong client") 'Action 5 (else) - server writes to Pipe
End If
Dim ClientResponse As String = ss.ReadString()
Debug.WriteLine("Server has read client Response as: " & ClientResponse) 'Action 8 - server reads from Pipe
DeviceInfo.Dispatcher.BeginInvoke(Windows.Threading.DispatcherPriority.Normal, New OneArgDelegate3(AddressOf ProcessPipeString), ClientResponse)
Catch ex As Exception
Debug.WriteLine("Error is Server Try block: " & ex.Message)
End Try
pipeserver.Flush()
pipeserver.Close() 'Action 9 - server closes Pipe
pipeserver.Dispose()
Debug.WriteLine("PipeServer now closed")
Catch ex As Exception
End Try
Call PipeServerThread()
End Sub
管道客户端:
Private Sub PipeWriter(StringToWrite As String)
Dim pipeClient As New NamedPipeClientStream(".", "testpipe", PipeDirection.InOut, PipeOptions.None)
Try
pipeClient.Connect(50)
Dim ss As New StreamString(pipeClient)
'Once a connection is established, Server will write to pipe first
'This is read by the client in the line below
Debug.WriteLine("First string from Server: " & ss.ReadString()) 'Action 2: Client Reads from Pipe
'Server is now waiting. This client responds with its name
ss.WriteString("PipeWriterService") 'Action 3: Client Writes to Pipe
'Server will respond again
'This is read by the client in the line below
RequestedCommState = ss.ReadString() 'Action 6: Client reads from Pipe
Debug.WriteLine("Second string from Server: " & RequestedCommState)
'This response contains the desired 3G comm status from the server
'Server is now waiting. This client responds with whatever it wants to say to server
ss.WriteString(StringToWrite) 'Action 7: Client writes to Pipe
Catch ex As Exception
Debug.WriteLine("Error in PipeWriter. Error is: " & ex.Message)
End Try
End Sub
最佳答案
此时您可能已经解决了问题。
无论如何,问题是在 PipeServerThread() 中的重新递归调用。每次调用它时,堆栈的大小都会增加以容纳局部变量和函数的返回地址。
你必须摆脱递归调用并将函数体放入循环中。
关于.net - vb.Net- 命名管道 - NamedPipeServerStream - StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50239378/
dataElementsList : TypesAndData.DataElement list 是一个包含 50,000 条记录的列表(实际上更多,但让我们从小处开始)。我正在尝试序列化为 JSON
我试图序列化一个自定义类型,该类型在其他成员中包含一个字典。与字典的键和值相关联的类型是实现的接口(interface)。 字典看起来像 Dictionary TypeA implements IT
我有一个 C# 工厂对象,它使用对象列表作为源,通过工厂方法创建对象。 对象列表的创建方式如下: public WidgetFactory() { widgetLibrary
我正在 GenericList 类中实现递归快速排序方法。我将有第二种方法,它接受一个compareDelegate来比较不同的类型,但出于开发目的,我对GenericList进行排序。 我根据列表大
我为我的作业编写了一种方法,用于通过递归计算整数数组的所有排列。 (我正在尝试实现回溯算法)。但计算超过 7 个数字的前突变时会导致 StackOverflowException 。我不知道如何解决这
我正在尝试将一个大文件拆分成许多小文件。每个拆分发生的位置基于检查每个给定行的内容返回的谓词(isNextObject 函数)。 我试图通过 File.ReadLines 函数读取大文件,这样我就可以
我正在使用 onSuccessCallBack() 接口(interface)方法同步大量数据。按照如图所示的方法将数据发送到服务器。在这里我面临 StackOverflowException 的问题
我必须递归调用一个函数。但片刻之后它会抛出 StackOverFlowException。当我使用 Invoke(new Action(Start)) 方法时,它会抛出相同的异常,但不会在很长一段时间
我有一些依赖于 HttpContext.Cache 的代码,我希望它在满足特定条件时重新缓存某些内容。但是,这会引入潜在的堆栈溢出,我不确定这里的适当方法是什么。 看看这段代码: void OnCac
我将我的代码剥离到导致问题的部分。代码在这里来回跳转第5行和第9行,导致stackoverflowexception。 我该如何做呢?我需要 Game 类中的 Platform 实例才能在函数中使用。
我的问题很简单。我有这个新表格,我只是编写代码: public partial class Form1 : Form { public Form1() { In
根据我的question (通用方法的可重用非通用方法)我已经实现了提供的解决方案,但经过一些重构(将代码移动到基类)后,我的代码导致了我不理解的 StackOverflowException。 调用
背景。我的脚本在递归搜索大字符串中的特定文本时遇到 StackOverflowException。循环不是无限的;问题发生在 9,000-10,000 次合法搜索之间(对于特定搜索)——我需要它继续进
请帮助我解决 System.StackOverflowException我想用 .aspx 将记录写入数据库我使用 4 层架构来实现这一切都正常但是当我编译页面然后它显示要插入数据的字段时,当我将数据
我正在尝试回答 my own old question基于我唯一的(无效的)答案。 这个想法是为了简化按值排序的映射的创建: public class SortedByValueMap> implem
我目前正在制作有界数组堆栈。此方法将大于存储容量的数组抛出到 StackOverflowException,除了我不断收到“throws StackOverflowException 部分”的错误消息
我正在使用以下方法递归迭代对象的属性: void GetProps(object obj) { if (obj == null) return; var objType
我想做一个非常简单的任务,它以某种方式使程序崩溃。 我有一个包含数字的列表,所有数字都是唯一的。超过一定数量,我想倒序。 示例:5, 16, 11, 3, 8, 4 -> 5, 16, 11, 4,
我正在尝试编写一个函数来检查字符串是否为回文,并使用 this example ,我正在尝试使用递归匿名函数反转字符串: static Boolean checkPalindromeAnonRec(s
这段代码有什么问题?我不断收到 StackOverlflowException.. public class Places { public string Title { get; set;
我是一名优秀的程序员,十分优秀!