Giúp bạn tối ưu hóa một chương trình C #

Đây là một số kinh nghiệm về tối ưu hóa mã nguồn C# sau một khoảng thời gian làm việc với nó. Bạn có thể áp dụng một số thủ thuật này trong các ngôn ngữ khác như VB.Net, Java…

Trong bài này, tôi sẽ làm một ví dụ về gửi và nhận DataTable qua Socket trong C#. Bạn có thể thay DataTable bằng Dataset. Code tôi để ở chế độ mở (dùng object) nên bạn có thể làm được điều này.
Phương thức này dùng để Serialize một đối tượng bất kỳ thành mảng byte

public byte[] SerializeData(Object o)
	      {
	          MemoryStream ms = new MemoryStream();
	          BinaryFormatter bf1 = new BinaryFormatter();
	          bf1.Serialize(ms, o);
	          return ms.ToArray();
	      }

Phương thức này dùng để DeSerialize một mảng byte thành đối tượng bất kỳ

public object DeserializeData(byte[] theByteArray)
	        {
 	            MemoryStream ms = new MemoryStream(theByteArray);
 	            BinaryFormatter bf1 = new BinaryFormatter();
	            ms.Position = 0;
	            return bf1.Deserialize(ms);
 	        }

Tạo Solution

Bạn tạo 1 solution có tên chẳng hạn là SocketInCSharp.
1. Đầu tiên là ở server: Add 1project, đặt tên là SocketServer, thêm 1 form và trên form thêm 1 nút có tên Start. Kết quả như sau:

server

Source code như sau:

using System;
 	using System.Collections.Generic;
 	using System.ComponentModel;
 	using System.Data;
 	using System.Drawing;
 	using System.Text;
 	using System.Windows.Forms;
	using System.Net;
 	using System.Net.Sockets;
	using System.Runtime.Serialization;
	using System.Runtime.Serialization.Formatters.Binary;
 	using System.IO;
 	namespace SocketServer
 	{
 	    public partial class Form1 : Form
 	    {
	        private Socket sock = null;
	        public Form1()
 	        {
	            InitializeComponent();
 	        }

 	        private void startButton_Click(object sender, EventArgs e)
	        {
 	            startButton.Text = "In process...";
 	            Application.DoEvents();

 	            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5656);
 	            sock = new Socket(AddressFamily.InterNetwork,   SocketType.Stream, ProtocolType.IP);
	            sock.Bind(ipEnd);
	            sock.Listen(100);
 	            Socket clientSock = sock.Accept();
 	            DataTable table = getdata();
 	            clientSock.Send(SerializeData(table));

	            sock.Close();
	            clientSock.Close();
 	            startButton.Text = "&Start Server";
 	            Application.DoEvents();
 	        }

 	        public byte[] SerializeData(Object o)
	        {
 	            MemoryStream ms = new MemoryStream();
 	            BinaryFormatter bf1 = new BinaryFormatter();
 	            bf1.Serialize(ms, o);
 	            return ms.ToArray();
 	        }

	       /*Ở đây tôi tạo 1 bảng dữ liệu thử.
 	Bạn có thể kết nối csdl và load dữ liệu lên*/
 	       private DataTable getdata()
 	        {
 	            DataTable dt = new DataTable();
 	            DataRow dr;

 	            dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
 	            dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
 	            dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime)));
 	            dt.Columns.Add(new DataColumn("BooleanValue", typeof(bool)));

 	            for (int i = 1; i

Biên dịch chương trình sau đó mở thư mục bin/Debug để chạy tập tin SocketServer.exe. Nhấn nút Start Server để bắt đầu chạy server. Mỗi lần gửi xong phải nhấn nút start một lần. Bạn có thể dùng Threading để cho nó chạy liên tục, tuy nhiên bạn sẽ phải xem đến phương thức SendAsync của socket.

2. Ở phía Client: Bạn Thêm 1 project khác có tên SocketClient vào Solution. Thêm vào 1 textbox để nhập server address, một nút nhấn để nhận dữ liệu. Thiết kế như  sau:

clientdesign

Source code cho form này như sau:

sing System;
 	using System.Collections.Generic;
 	using System.ComponentModel;
 	using System.Data;
 	using System.Drawing;
 	using System.  Text;
 	using System.Windows.Forms;
 	using System.IO;
 	using System.Net;
	using System.Net.Sockets;

	using System.Runtime.Serialization;
 	using System.Runtime.Serialization.Formatters.Binary;

	namespace SocketClient
 	{
 	    public partial class Form1 : Form
 	    {
	        public Form1()
 	        {
 	            InitializeComponent();
 	        }

 	        public object DeserializeData(byte[] theByteArray)
 	        {
 	            MemoryStream ms = new MemoryStream(theByteArray);
 	            BinaryFormatter bf1 = new BinaryFormatter();
 	            ms.Position = 0;
 	            return bf1.Deserialize(ms);
 	        }

 	        private void receiveButton_Click(object sender, EventArgs e)
 	        {
	            try
 	            {
 	                IPAddress[] ipAddress = Dns.GetHostAddresses(serverTextBox.Text);
 	                IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse("127.0.0.1"),5656);
 	                Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
 	                clientSock.Connect(ipEnd);
 	                byte[] data = new byte[1024 * 5000];
 	                clientSock.Receive(data);
 	                DataTable dt = (DataTable)DeserializeData(data);
 	                dataGridView1.DataSource = dt;
 	                clientSock.Close();
 	            }
 	            catch (Exception ex)
 	            {
 	                MessageBox.Show(ex.Message);
 	            }
	        }
 	    }
 	}

Kết quả sau khi nhấn nút nhận dữ liệu:

clientresult

Full Source Code: download here