【发布时间】:2014-11-10 13:49:32
【问题描述】:
我编写了一个程序来获取屏幕截图并发送到服务器。每次,我都会截屏并转换为base64,然后使用Socket.IO发送。 (使用 SocketIOClient.dll)
Dictionary<string, string> image = new Dictionary<string, string>();
image.add("image", "");
private void windowMonitorTimer_Tick(object sender, EventArgs e)
{
image["image"] = windowMonitorManager.MonitorScreen();
client.getSocket().Emit("Shot", image);
}
windowMonitorManager.MonitorScreen() 用于返回 base64 字符串。如果我不使用client.getSocket().Emit("Shot", image),程序可以正确运行,但如果我添加这一行,程序会停止 2 秒(发送近 80 次)并给我错误:
An unhandled exception of type 'System.OutOfMemoryException' occurred in mscorlib.dll
如果我不发送这么长的字符串,只是一个短字符串“hello”,它发送1600次就会出现同样的问题。
有人知道如何调试这个问题吗?
/////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// //////////////////////
我尝试测试socket.Emit(),发现它有它的极限。
比如我发送一个10000000的字符串,88次后出现内存不足的问题。 如果我发送一个5000000的字符串,170次后,会出现同样的问题。
【问题讨论】:
-
你有
System.OutOfMemoryException的完整堆栈跟踪吗? -
@PaulWilliams,如何使用 c# 跟踪完整堆栈?
-
@cindywmiao 你用的是什么IDE?视觉工作室?它应该有一个调试选项,您可以在其中插入断点并获取详细错误
-
您可以尝试在您的
client.GetSocket().Emit()呼叫周围使用catch,捕获所有Exceptions,然后打印或保存或以某种方式查看exception.ToString()。但这不一定会奏效,因为程序可能内存不足。如果您调试程序,您应该能够在异常发生时看到异常并查看完整的堆栈跟踪。 -
我不知道 SocketIOClient.dll 但可能你使用后必须关闭套接字?