public static async Task <MyTcpProxyServer> CreateInstance(
            MyTcpProxyServerSettings settings
            )
        {
            if (settings == null)
            {
                throw new ArgumentNullException(
                          MyNameof.GetLocalVarName(() => settings));
            }
            settings.CheckMe();
            var result = new MyTcpProxyServer();

            result._clientToDestination = new TcpClient();
            await result._clientToDestination.ConnectAsync(
                settings.DestinationHostname,
                settings.DestinationPort
                ).ConfigureAwait(false);

            try
            {
                result._serverTcpListener = new TcpListener(
                    IPAddress.Parse(settings.ServerHostname),
                    settings.ServerPort
                    );
                result._serverTcpListener.Start();
                try
                {
                    result._stateHelper.SetInitializedState();
                    result.WaitClientConnectAction();
                    return(result);
                }
                catch
                {
                    result._serverTcpListener.Stop();
                    throw;
                }
            }
            catch
            {
                result._clientToDestination.Close();
                throw;
            }
        }
 public static async Task<MyTcpProxyServer> CreateInstance(
     MyTcpProxyServerSettings settings
 )
 {
     if(settings == null)
         throw new ArgumentNullException(
             MyNameof.GetLocalVarName(() => settings));
     settings.CheckMe();
     var result = new MyTcpProxyServer();
     result._clientToDestination = new TcpClient();
     await result._clientToDestination.ConnectAsync(
         settings.DestinationHostname,
         settings.DestinationPort
     ).ConfigureAwait(false);
     try
     {
         result._serverTcpListener = new TcpListener(
             IPAddress.Parse(settings.ServerHostname),
             settings.ServerPort
         );
         result._serverTcpListener.Start();
         try
         {
             result._stateHelper.SetInitializedState();
             result.WaitClientConnectAction();
             return result;
         }
         catch
         {
             result._serverTcpListener.Stop();
             throw;
         }
     }
     catch
     {
         result._clientToDestination.Close();
         throw;
     }
 }