C# Comment puis-je arrêter un tcpClient.Connect() processus lorsque je suis prêt pour le programme à la fin? Il se trouve juste là pour comme 10 secondes!
C'est l'une de mes premières questions. Chaque fois que je quitte le programme, tcpClient.Connect() prend une éternité à se fermer. J'en ai essayé des tonnes de choses, et aucun d'eux ne semble fonctionner.
Prendre un coup d'oeil à la CreateConnection() thread, si le client n'est pas connecté... et je ferme le programme, cela prend une éternité à se fermer. Si il EST connecté, il se ferme immédiatement. Je sais que cela peut être fait avec une sorte de délai d'attente truc, mais j'ai essayé quelques-uns, et aucun d'entre eux travaillaient.
Veuillez fournir un exemple de code si vous le pouvez.
Aussi, est-il un bon tutoriel pour C# sur la lecture/écriture des octets avec un tampon à la place de cette version qui ne vient serveur maître.writeLine() et le serveur maître.readline() ou les deux sont-ils tout aussi efficace?
Si vous voyez quelque chose d'autre pour m'aider à améliorer cette... par tous les moyens, d'aller de l'avant. Je suis en train de m'enseigner comment le faire et je n'ai pas d'aide, afin de ne pas me laisser aller à faire quelque chose de mal si vous le voyez!!! Merci les gars!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace RemoteClient
{
public partial class Form1 : Form
{
private int MyPort = 56789;
private IPAddress myIp = IPAddress.Parse("210.232.115.79");
private IPAddress serverIp = IPAddress.Parse("72.216.18.77"); //Master Server's IP Address
public static TcpClient masterServer = new TcpClient();
private StreamWriter responseWriter;
private StreamReader commandReader;
private Thread connectionThread;
private Thread commandsThread;
private bool RequestExitConnectionThread { get; set; }
private delegate void AddMessageDelegate(string message, int category);
private delegate void ConnectedDelegate();
private bool isConnected { get; set; }
public Form1()
{
InitializeComponent();
isConnected = false;
}
private void LogMessage(string message, int category)
{
if (category == 1)
{
ListViewItem item = new ListViewItem(message);
item.BackColor = Color.LightGreen;
item.UseItemStyleForSubItems = true;
Log.Items.Add(item).SubItems.Add(DateTime.Now.ToString());
}
if (category == 2)
{
ListViewItem item = new ListViewItem(message);
item.BackColor = Color.Orange;
item.UseItemStyleForSubItems = true;
Log.Items.Add(item).SubItems.Add(DateTime.Now.ToString());
}
if (category == 3)
{
ListViewItem item = new ListViewItem(message);
item.BackColor = Color.Yellow;
item.UseItemStyleForSubItems = true;
Log.Items.Add(item).SubItems.Add(DateTime.Now.ToString());
}
if (category == 0)
{
Log.Items.Add(message).SubItems.Add(DateTime.Now.ToString());
}
}
private void Connected()
{
LogMessage("Found and Accepted Master Server's connection. Waiting for reply...",1);
Status.Text = "Connected!";
Status.ForeColor = Color.Green;
commandsThread = new Thread(new ThreadStart(RecieveCommands));
sendClientInfo();
}
private void exitButton_Click(object sender, EventArgs e)
{
Disconnect();
exitButton.Enabled = false;
exitButton.Text = "Closing...";
if (connectionThread != null)
{
while (connectionThread.IsAlive)
{
Application.DoEvents();
}
}
this.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
Connect();
}
private void Disconnect()
{
RequestExitConnectionThread = true;
if (masterServer != null)
masterServer.Close();
if (connectionThread != null)
connectionThread.Abort();
LogMessage("Closing Client. Please wait while Program threads end.", 2);
}
private void Disconnected()
{
Status.Text = "Disconnected";
Status.ForeColor = Color.Red;
Connect();
}
private void Connect()
{
LogMessage("Attempting to connect to Master Server...", 1);
connectionThread = new Thread(new ThreadStart(CreateConnection));
connectionThread.Start();
}
private void CreateConnection()
{
int i = 1;
bool success = false;
while (!success)
{
try
{
using (masterServer = new TcpClient())
{
IAsyncResult result = masterServer.BeginConnect(serverIp, MyPort, null, null);
success = result.AsyncWaitHandle.WaitOne(1000, false);
}
if (success)
{
BeginInvoke(new ConnectedDelegate(this.Connected), new object[] {});
break;
}
else
{
Thread.Sleep(2000);
BeginInvoke(new AddMessageDelegate(LogMessage), new object[] { "Connection Retry # " + i.ToString() + ". Master Server hasn't been started yet.", 3 });
}
}
catch
{
MessageBox.Show("Error!");
}
i++;
}
}
private void RecieveCommands()
{
MessageBox.Show("Hello!");
commandReader = new StreamReader(masterServer.GetStream());
string CommandResponse = commandReader.ReadLine();
string Command = null;
if (CommandResponse != null)
MessageBox.Show("Recieved Command that was NOT null!");
if (CommandResponse != null)
{
MessageBox.Show("Recieved null response!");
BeginInvoke(new AddMessageDelegate(LogMessage), new object[] { "Disconnected From Master Server. Reason: Recieved Null response.", 1 });
Disconnected();
}
else if (CommandResponse.StartsWith("0"))
{
MessageBox.Show("Recieved 0 as a response!");
Command = CommandResponse.Substring(2).Trim();
isConnected = false;
BeginInvoke(new AddMessageDelegate(LogMessage), new object[] { "Disconnected From Master Server. Reason: " + Command, 1 });
}
else if (CommandResponse.StartsWith("1"))
{
MessageBox.Show("Recieved 1 as a response!");
isConnected = true;
BeginInvoke(new AddMessageDelegate(LogMessage), new object[] { "Connected to Master Server Successfully.", 1 });
}
}
//************************** RESPONSE'S BELOW HERE ************************* \\
private void sendClientInfo()
{
responseWriter = new StreamWriter(masterServer.GetStream());
responseWriter.WriteLine(myIp.ToString());
responseWriter.Flush();
}
}
}
OriginalL'auteur OneShot | 2009-04-27
Vous devez vous connecter pour publier un commentaire.
L'ajout d'une case à l'intérieur de votre processus de connexion à l'annuler si le programme est sortie devrait aider.
Essayez d'ajouter ce dans
CreateConnection()
à l'intérieur de votrewhile(!success)
boucle, mais avant de votretry
bloc:Voici un exemple d'un asynchrones BeginConnect() appel:
OnConnect fonction:
Oh, tu veux dire serveur maître.BeginConnect() ? Dans ce cas, l'utilisation BeginConnect()'s de rappel paramètre pour obtenir les fonctionnalités asynchrones. Je vais mettre à jour ma réponse à inclure ce code.
OriginalL'auteur Steven Richards
Désolé, après un essai: NON, il n'utilisez pas un async waithandle, il bloque le processus 🙁
Je préfère cette solution, qui permet aussi de bloquer le processus, mais seulement par la période que vous spécifiez, dans ce cas 5 secondes:
À partir de: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/2281199d-cd28-4b5c-95dc-5a888a6da30d
L'exemple suivant utilise à la fois async et de connexion asynchrone délai d'attente de contrôle:
La Solution ci-dessus, bloque le processus dans ma VS2010 programme de test.
oui, c'est fait. Je vais mettre à jour ce post.
Le premier va bloquer le processus pendant 5 secondes tout au plus. Le second est exécuté en Tâche, de sorte que le processus de lancement, il ne va pas bloquer. Le code à l'intérieur de la Tâche sera encore attendre à plus de 5 secondes. Personnellement je pencherais pour la seconde, de sorte que le processus principal ne sera jamais bloqué, améliorer la réactivité.
Il a obtenu, grâce. Donc, La première est idéal si vous êtes déjà sur un autre réseau fil.
OriginalL'auteur JoanComasFdz
connecter avec délai d'attente de 2000 ms:
OriginalL'auteur