Sockets C#TCP服务器/客户端对象传输/序列化/反序列化越来越多地使用所需的内存帮助
首先,也是最重要的, 提前感谢所有可能提供帮助、批评和建议的人。 语言:C#Sockets C#TCP服务器/客户端对象传输/序列化/反序列化越来越多地使用所需的内存帮助,sockets,object,serialization,tcp,deserialization,Sockets,Object,Serialization,Tcp,Deserialization,首先,也是最重要的, 提前感谢所有可能提供帮助、批评和建议的人。 语言:C# 目标:用于图像和对象传输的TCP服务器/客户端 服务器场景: 服务器将侦听客户端连接 客户端连接后,服务器将从套接字接收字节[]数据 服务器将字节[]转换为(类型)对象 然后,服务器将使用此(类型)对象更新WPF映像控件 客户端场景: public void StartServer() { //------------------------------------------------
目标:用于图像和对象传输的TCP服务器/客户端
服务器场景: 服务器将侦听客户端连接 客户端连接后,服务器将从套接字接收字节[]数据 服务器将字节[]转换为(类型)对象 然后,服务器将使用此(类型)对象更新WPF映像控件
客户端场景:
public void StartServer()
{
//-------------------------------------------------------
// Initialize Variables For Server
//-------------------------------------------------------
int recv;
byte[] data;
//-------------------------------------------------------
// Configure Server Listener
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Bind Socket To IPEndpoint And Listen
//-------------------------------------------------------
newsock.Bind(ipep);
newsock.Listen(10);
//-------------------------------------------------------
// Accept New Connection
//-------------------------------------------------------
Console.WriteLine("Waiting for a client...");
Socket client = newsock.Accept();
//-------------------------------------------------------
// Verify Client Endpoint Connection
//-------------------------------------------------------
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
//-------------------------------------------------------
// Start Reading From Socket While Client Connected
//-------------------------------------------------------
while (client.Connected)
{
data = new byte[500000]; // Create Buffer For Object
recv = client.Receive(data); // Ensure Client Has Sent Data
if (recv == 0)
break;
//-------------------------------------------------------
// Create Test Object And De-Serialize
//-------------------------------------------------------
TestObject to = new TestObject(); //Object For Storage
Console.WriteLine("Server Object Size: " + data.Length); // Check Length For Interest
var dataToObject = ByteArrayToObject(data); // Convert Object Byte[] to Object
to = (TestObject)dataToObject; // Store Converted Byte[] Object into Typed Object
Console.WriteLine("Server De-Serialized Object from Client."); // Provide Information
Console.Out.WriteLine("Server TestObject: " + to.testString); // Extract And Notify Object String Data
//-------------------------------------------------------
// Update Main GUI Image (WPF)
//-------------------------------------------------------
this.Dispatcher.Invoke((Action)(() =>
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); // Create Type Converter
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(to.testBmp); // Cast into Bitmap from Byte[]
imgRemoteDisplay.Source = ByteMonImaging.GetBitmapSource(bitmap1); // Display Bitmap
bitmap1 = null;
tc = null;
}));
//-------------------------------------------------------
// Clean Up
//-------------------------------------------------------
dataToObject = null;
data = null;
to = null;
GC.Collect();
//-------------------------------------------------------
}
Console.WriteLine("Disconnected from {0}", clientep.Address);
//-------------------------------------------------------
// Close Listener
//-------------------------------------------------------
client.Close();
newsock.Close();
}
public void ConnectClient()
{
//-------------------------------------------------------
// Configure Server Connection
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Establish Connection To Server
//-------------------------------------------------------
try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}
//-------------------------------------------------------
// Start Sending Object To Server While Connected
//-------------------------------------------------------
while(server.Connected)
{
TestObject to = new TestObject(); // Create blank object store
to.testString = "TestObject String Here"; // Set Blank Object Test String
var bmpToSend = ByteMonImaging.CaptureBitmap(); // Set Blank Object Test Bitmap
to.testBmp = ByteMonImaging.ImageToByte(bmpToSend); // Convert Bitmap to Byte[]
var byteArray = ObjectToByteArray(to); // Pack Object into Byte[]
Console.WriteLine("Client Object Size: " + byteArray.Length); // Curious Byte[] Size
server.Send(byteArray); // Send Byte[] Object Via TCP
Console.WriteLine("Client Sent Serialized Object to Server."); // Notify Where We Are At
bmpToSend = null; // Clean Up
to = null; // Clean Up
byteArray = null; // Clean Up
GC.Collect(); // Clean Up (Added for Checks)
}
//-------------------------------------------------------
// Close Connection to Socket And Server
//-------------------------------------------------------
Console.WriteLine("Disconnecting from server...");
server.Shutdown(SocketShutdown.Both);
server.Close();
}
客户端将创建准备传输的对象
客户端将把对象转换为存储的字节[]
客户端将连接到服务器并通过套接字发送对象
问题:
public void StartServer()
{
//-------------------------------------------------------
// Initialize Variables For Server
//-------------------------------------------------------
int recv;
byte[] data;
//-------------------------------------------------------
// Configure Server Listener
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Bind Socket To IPEndpoint And Listen
//-------------------------------------------------------
newsock.Bind(ipep);
newsock.Listen(10);
//-------------------------------------------------------
// Accept New Connection
//-------------------------------------------------------
Console.WriteLine("Waiting for a client...");
Socket client = newsock.Accept();
//-------------------------------------------------------
// Verify Client Endpoint Connection
//-------------------------------------------------------
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
//-------------------------------------------------------
// Start Reading From Socket While Client Connected
//-------------------------------------------------------
while (client.Connected)
{
data = new byte[500000]; // Create Buffer For Object
recv = client.Receive(data); // Ensure Client Has Sent Data
if (recv == 0)
break;
//-------------------------------------------------------
// Create Test Object And De-Serialize
//-------------------------------------------------------
TestObject to = new TestObject(); //Object For Storage
Console.WriteLine("Server Object Size: " + data.Length); // Check Length For Interest
var dataToObject = ByteArrayToObject(data); // Convert Object Byte[] to Object
to = (TestObject)dataToObject; // Store Converted Byte[] Object into Typed Object
Console.WriteLine("Server De-Serialized Object from Client."); // Provide Information
Console.Out.WriteLine("Server TestObject: " + to.testString); // Extract And Notify Object String Data
//-------------------------------------------------------
// Update Main GUI Image (WPF)
//-------------------------------------------------------
this.Dispatcher.Invoke((Action)(() =>
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); // Create Type Converter
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(to.testBmp); // Cast into Bitmap from Byte[]
imgRemoteDisplay.Source = ByteMonImaging.GetBitmapSource(bitmap1); // Display Bitmap
bitmap1 = null;
tc = null;
}));
//-------------------------------------------------------
// Clean Up
//-------------------------------------------------------
dataToObject = null;
data = null;
to = null;
GC.Collect();
//-------------------------------------------------------
}
Console.WriteLine("Disconnected from {0}", clientep.Address);
//-------------------------------------------------------
// Close Listener
//-------------------------------------------------------
client.Close();
newsock.Close();
}
public void ConnectClient()
{
//-------------------------------------------------------
// Configure Server Connection
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Establish Connection To Server
//-------------------------------------------------------
try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}
//-------------------------------------------------------
// Start Sending Object To Server While Connected
//-------------------------------------------------------
while(server.Connected)
{
TestObject to = new TestObject(); // Create blank object store
to.testString = "TestObject String Here"; // Set Blank Object Test String
var bmpToSend = ByteMonImaging.CaptureBitmap(); // Set Blank Object Test Bitmap
to.testBmp = ByteMonImaging.ImageToByte(bmpToSend); // Convert Bitmap to Byte[]
var byteArray = ObjectToByteArray(to); // Pack Object into Byte[]
Console.WriteLine("Client Object Size: " + byteArray.Length); // Curious Byte[] Size
server.Send(byteArray); // Send Byte[] Object Via TCP
Console.WriteLine("Client Sent Serialized Object to Server."); // Notify Where We Are At
bmpToSend = null; // Clean Up
to = null; // Clean Up
byteArray = null; // Clean Up
GC.Collect(); // Clean Up (Added for Checks)
}
//-------------------------------------------------------
// Close Connection to Socket And Server
//-------------------------------------------------------
Console.WriteLine("Disconnecting from server...");
server.Shutdown(SocketShutdown.Both);
server.Close();
}
我不确定为什么这个过程会增加每秒60-100MB的内存使用量
我想知道Byte[]分块是否是一个值得一试的解决方案(如果是这样,请告诉我一个资源或提供一个解决方案)
它感觉自己没有正确地清理或重新使用变量
注意事项:
public void StartServer()
{
//-------------------------------------------------------
// Initialize Variables For Server
//-------------------------------------------------------
int recv;
byte[] data;
//-------------------------------------------------------
// Configure Server Listener
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Bind Socket To IPEndpoint And Listen
//-------------------------------------------------------
newsock.Bind(ipep);
newsock.Listen(10);
//-------------------------------------------------------
// Accept New Connection
//-------------------------------------------------------
Console.WriteLine("Waiting for a client...");
Socket client = newsock.Accept();
//-------------------------------------------------------
// Verify Client Endpoint Connection
//-------------------------------------------------------
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
//-------------------------------------------------------
// Start Reading From Socket While Client Connected
//-------------------------------------------------------
while (client.Connected)
{
data = new byte[500000]; // Create Buffer For Object
recv = client.Receive(data); // Ensure Client Has Sent Data
if (recv == 0)
break;
//-------------------------------------------------------
// Create Test Object And De-Serialize
//-------------------------------------------------------
TestObject to = new TestObject(); //Object For Storage
Console.WriteLine("Server Object Size: " + data.Length); // Check Length For Interest
var dataToObject = ByteArrayToObject(data); // Convert Object Byte[] to Object
to = (TestObject)dataToObject; // Store Converted Byte[] Object into Typed Object
Console.WriteLine("Server De-Serialized Object from Client."); // Provide Information
Console.Out.WriteLine("Server TestObject: " + to.testString); // Extract And Notify Object String Data
//-------------------------------------------------------
// Update Main GUI Image (WPF)
//-------------------------------------------------------
this.Dispatcher.Invoke((Action)(() =>
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); // Create Type Converter
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(to.testBmp); // Cast into Bitmap from Byte[]
imgRemoteDisplay.Source = ByteMonImaging.GetBitmapSource(bitmap1); // Display Bitmap
bitmap1 = null;
tc = null;
}));
//-------------------------------------------------------
// Clean Up
//-------------------------------------------------------
dataToObject = null;
data = null;
to = null;
GC.Collect();
//-------------------------------------------------------
}
Console.WriteLine("Disconnected from {0}", clientep.Address);
//-------------------------------------------------------
// Close Listener
//-------------------------------------------------------
client.Close();
newsock.Close();
}
public void ConnectClient()
{
//-------------------------------------------------------
// Configure Server Connection
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Establish Connection To Server
//-------------------------------------------------------
try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}
//-------------------------------------------------------
// Start Sending Object To Server While Connected
//-------------------------------------------------------
while(server.Connected)
{
TestObject to = new TestObject(); // Create blank object store
to.testString = "TestObject String Here"; // Set Blank Object Test String
var bmpToSend = ByteMonImaging.CaptureBitmap(); // Set Blank Object Test Bitmap
to.testBmp = ByteMonImaging.ImageToByte(bmpToSend); // Convert Bitmap to Byte[]
var byteArray = ObjectToByteArray(to); // Pack Object into Byte[]
Console.WriteLine("Client Object Size: " + byteArray.Length); // Curious Byte[] Size
server.Send(byteArray); // Send Byte[] Object Via TCP
Console.WriteLine("Client Sent Serialized Object to Server."); // Notify Where We Are At
bmpToSend = null; // Clean Up
to = null; // Clean Up
byteArray = null; // Clean Up
GC.Collect(); // Clean Up (Added for Checks)
}
//-------------------------------------------------------
// Close Connection to Socket And Server
//-------------------------------------------------------
Console.WriteLine("Disconnecting from server...");
server.Shutdown(SocketShutdown.Both);
server.Close();
}
位图捕获和转换为字节[]工作得很好。这不是问题所在,但如果问题不在下面的代码中,或者如果其他人会受益,我可以发布代码
ObjecttoByte[]和ByteArrayToObject代码可以工作,并且与其他堆栈溢出文章相比有轻微的修改,比如wise,如果问题不在下面的代码中,或者如果其他人会受益,我可以发布它
服务器侦听器代码:
public void StartServer()
{
//-------------------------------------------------------
// Initialize Variables For Server
//-------------------------------------------------------
int recv;
byte[] data;
//-------------------------------------------------------
// Configure Server Listener
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Bind Socket To IPEndpoint And Listen
//-------------------------------------------------------
newsock.Bind(ipep);
newsock.Listen(10);
//-------------------------------------------------------
// Accept New Connection
//-------------------------------------------------------
Console.WriteLine("Waiting for a client...");
Socket client = newsock.Accept();
//-------------------------------------------------------
// Verify Client Endpoint Connection
//-------------------------------------------------------
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
//-------------------------------------------------------
// Start Reading From Socket While Client Connected
//-------------------------------------------------------
while (client.Connected)
{
data = new byte[500000]; // Create Buffer For Object
recv = client.Receive(data); // Ensure Client Has Sent Data
if (recv == 0)
break;
//-------------------------------------------------------
// Create Test Object And De-Serialize
//-------------------------------------------------------
TestObject to = new TestObject(); //Object For Storage
Console.WriteLine("Server Object Size: " + data.Length); // Check Length For Interest
var dataToObject = ByteArrayToObject(data); // Convert Object Byte[] to Object
to = (TestObject)dataToObject; // Store Converted Byte[] Object into Typed Object
Console.WriteLine("Server De-Serialized Object from Client."); // Provide Information
Console.Out.WriteLine("Server TestObject: " + to.testString); // Extract And Notify Object String Data
//-------------------------------------------------------
// Update Main GUI Image (WPF)
//-------------------------------------------------------
this.Dispatcher.Invoke((Action)(() =>
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); // Create Type Converter
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(to.testBmp); // Cast into Bitmap from Byte[]
imgRemoteDisplay.Source = ByteMonImaging.GetBitmapSource(bitmap1); // Display Bitmap
bitmap1 = null;
tc = null;
}));
//-------------------------------------------------------
// Clean Up
//-------------------------------------------------------
dataToObject = null;
data = null;
to = null;
GC.Collect();
//-------------------------------------------------------
}
Console.WriteLine("Disconnected from {0}", clientep.Address);
//-------------------------------------------------------
// Close Listener
//-------------------------------------------------------
client.Close();
newsock.Close();
}
public void ConnectClient()
{
//-------------------------------------------------------
// Configure Server Connection
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Establish Connection To Server
//-------------------------------------------------------
try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}
//-------------------------------------------------------
// Start Sending Object To Server While Connected
//-------------------------------------------------------
while(server.Connected)
{
TestObject to = new TestObject(); // Create blank object store
to.testString = "TestObject String Here"; // Set Blank Object Test String
var bmpToSend = ByteMonImaging.CaptureBitmap(); // Set Blank Object Test Bitmap
to.testBmp = ByteMonImaging.ImageToByte(bmpToSend); // Convert Bitmap to Byte[]
var byteArray = ObjectToByteArray(to); // Pack Object into Byte[]
Console.WriteLine("Client Object Size: " + byteArray.Length); // Curious Byte[] Size
server.Send(byteArray); // Send Byte[] Object Via TCP
Console.WriteLine("Client Sent Serialized Object to Server."); // Notify Where We Are At
bmpToSend = null; // Clean Up
to = null; // Clean Up
byteArray = null; // Clean Up
GC.Collect(); // Clean Up (Added for Checks)
}
//-------------------------------------------------------
// Close Connection to Socket And Server
//-------------------------------------------------------
Console.WriteLine("Disconnecting from server...");
server.Shutdown(SocketShutdown.Both);
server.Close();
}
客户端连接代码:
public void StartServer()
{
//-------------------------------------------------------
// Initialize Variables For Server
//-------------------------------------------------------
int recv;
byte[] data;
//-------------------------------------------------------
// Configure Server Listener
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Bind Socket To IPEndpoint And Listen
//-------------------------------------------------------
newsock.Bind(ipep);
newsock.Listen(10);
//-------------------------------------------------------
// Accept New Connection
//-------------------------------------------------------
Console.WriteLine("Waiting for a client...");
Socket client = newsock.Accept();
//-------------------------------------------------------
// Verify Client Endpoint Connection
//-------------------------------------------------------
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
//-------------------------------------------------------
// Start Reading From Socket While Client Connected
//-------------------------------------------------------
while (client.Connected)
{
data = new byte[500000]; // Create Buffer For Object
recv = client.Receive(data); // Ensure Client Has Sent Data
if (recv == 0)
break;
//-------------------------------------------------------
// Create Test Object And De-Serialize
//-------------------------------------------------------
TestObject to = new TestObject(); //Object For Storage
Console.WriteLine("Server Object Size: " + data.Length); // Check Length For Interest
var dataToObject = ByteArrayToObject(data); // Convert Object Byte[] to Object
to = (TestObject)dataToObject; // Store Converted Byte[] Object into Typed Object
Console.WriteLine("Server De-Serialized Object from Client."); // Provide Information
Console.Out.WriteLine("Server TestObject: " + to.testString); // Extract And Notify Object String Data
//-------------------------------------------------------
// Update Main GUI Image (WPF)
//-------------------------------------------------------
this.Dispatcher.Invoke((Action)(() =>
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); // Create Type Converter
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(to.testBmp); // Cast into Bitmap from Byte[]
imgRemoteDisplay.Source = ByteMonImaging.GetBitmapSource(bitmap1); // Display Bitmap
bitmap1 = null;
tc = null;
}));
//-------------------------------------------------------
// Clean Up
//-------------------------------------------------------
dataToObject = null;
data = null;
to = null;
GC.Collect();
//-------------------------------------------------------
}
Console.WriteLine("Disconnected from {0}", clientep.Address);
//-------------------------------------------------------
// Close Listener
//-------------------------------------------------------
client.Close();
newsock.Close();
}
public void ConnectClient()
{
//-------------------------------------------------------
// Configure Server Connection
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Establish Connection To Server
//-------------------------------------------------------
try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}
//-------------------------------------------------------
// Start Sending Object To Server While Connected
//-------------------------------------------------------
while(server.Connected)
{
TestObject to = new TestObject(); // Create blank object store
to.testString = "TestObject String Here"; // Set Blank Object Test String
var bmpToSend = ByteMonImaging.CaptureBitmap(); // Set Blank Object Test Bitmap
to.testBmp = ByteMonImaging.ImageToByte(bmpToSend); // Convert Bitmap to Byte[]
var byteArray = ObjectToByteArray(to); // Pack Object into Byte[]
Console.WriteLine("Client Object Size: " + byteArray.Length); // Curious Byte[] Size
server.Send(byteArray); // Send Byte[] Object Via TCP
Console.WriteLine("Client Sent Serialized Object to Server."); // Notify Where We Are At
bmpToSend = null; // Clean Up
to = null; // Clean Up
byteArray = null; // Clean Up
GC.Collect(); // Clean Up (Added for Checks)
}
//-------------------------------------------------------
// Close Connection to Socket And Server
//-------------------------------------------------------
Console.WriteLine("Disconnecting from server...");
server.Shutdown(SocketShutdown.Both);
server.Close();
}
找到内存消耗的原因
//-------------------------------------------------------
// Update Main GUI Image (WPF)
//-------------------------------------------------------
this.Dispatcher.Invoke((Action)(() =>
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); // Create Type Converter
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(to.testBmp); // Cast into Bitmap from Byte[]
imgRemoteDisplay.Source = ByteMonImaging.GetBitmapSource(bitmap1); // Display Bitmap
bitmap1 = null;
tc = null;
}));
解决方案:问题是hBitmap在调用时导致内存泄漏。使用finally子句,我可以使用externdll删除对象
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr ipObj);
public static BitmapSource GetBitmapSource(Bitmap bmp)
{
IntPtr hBitmap = bmp.GetHbitmap();
System.Windows.Media.Imaging.BitmapSource b;
try
{
b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
return b;
}
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr ipObj);
public static BitmapSource GetBitmapSource(Bitmap bmp)
{
IntPtr hBitmap = bmp.GetHbitmap();
System.Windows.Media.Imaging.BitmapSource b;
try
{
b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
return b;
}
解决方案:问题是hBitmap在调用时导致内存泄漏。使用finally子句,我可以使用externdll删除对象
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr ipObj);
public static BitmapSource GetBitmapSource(Bitmap bmp)
{
IntPtr hBitmap = bmp.GetHbitmap();
System.Windows.Media.Imaging.BitmapSource b;
try
{
b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
return b;
}
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr ipObj);
public static BitmapSource GetBitmapSource(Bitmap bmp)
{
IntPtr hBitmap = bmp.GetHbitmap();
System.Windows.Media.Imaging.BitmapSource b;
try
{
b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
return b;
}
请用你正在使用的语言标记你的问题。它看起来像Java,对吗?更新了C#;很抱歉没有提供:)