Is there anyway to make this piece of code more elegant? It's not a nice view, but I can't really see a way to improve the looks of it or shorten it.
private void Send(CancellationToken CTSSend)
{
try
{
NativeMethods.Rect rc;
NativeMethods.GetWindowRect(hwnd, out rc);
IntPtr dc1;
IntPtr dc2 = NativeMethods.GetWindowDC(hwnd);
using (tcp = new TcpClient())
{
tcp.NoDelay = true;
while (!tcp.Connected && !CTSSend.IsCancellationRequested)
{
try
{
if (!tcp.Connected)
tcp.Connect(adress);
}
catch (Exception e)
{
if (e is SocketException) { Console.WriteLine(e.Message); }
else
MessageBox.Show(e.Message + " Tcp Connect : Send");
}
}
using (EncoderParameters JpegParam = new EncoderParameters())
using (JpegParam.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L))
using (Bitmap bmp = new Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
using (Graphics g = Graphics.FromImage(bmp))
using (var ms = new MemoryStream())
using (var tcpStream = tcp.GetStream())
while (tcp.Connected && !CTSSend.IsCancellationRequested)
{
try
{
dc1 = g.GetHdc();
NativeMethods.BitBlt(dc1, 0, 0, rc.Width, rc.Height, dc2, 0, 0, 13369376);
g.ReleaseHdc(dc1);
bmp.Save(ms, jpeg, JpegParam);
if (bsize != ms.Length)
{
bsize = ms.Length;
tcpStream.Write(BitConverter.GetBytes(bsize), 0, 4);
tcpStream.Write(ms.GetBuffer(), 0, (int)bsize);
}
ms.SetLength(0);
}
catch (Exception e)
{
if (e is IOException)
{
try { connect.Invoke(new Action(() => { connect.Text = "Connect"; })); }
catch (InvalidOperationException) { return; }
capcon = false;
}
else
MessageBox.Show(e.Message + ": Send Error");
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message + "SEND");
}
}
I am trying to find a nice way to put TCP reconnecting in another class, but I found a limitation where I have to call return
in the main class.
internal static void TCPReconnect(CancellationToken CTS, TcpClient tcp, IPEndPoint adress)
{
tcp.NoDelay = true;
while (!tcp.Connected && !CTS.IsCancellationRequested)
{
try
{
if (!tcp.Connected)
tcp.Connect(adress);
}
catch (Exception e)
{
if (e is SocketException) { Console.WriteLine(e.Message); }
else
MessageBox.Show(e.Message + " Tcp Connect : Send");
}
}
}
So, when it fails, it goes out of the loop. I can also make it call Return
, but it will do the same thing.
In the class Caller
I have to use:
FastMethods.TCPReconnect(CTS, tcp, adress);
if (CTS.IsCancellationRequested)
return;
As you can see, I have to recheck for CTS. Is it possible to have it inside the other class somehow?
If I use:
if (CTS.IsCancellationRequested)
return;
It will simply return to the main class and continue.