当我尝试使用套接字连接时,C#GUI挂起。需要一种分离GUI线程的方法吗?
当我尝试连接套接字时,我需要一种分离GUI线程的方法 当我的应用程序运行时,当lan电缆连接到PC端口时,我的C#代码正确连接,没有任何挂起GUI。没有问题。 但是,当没有Lan端口连接到我的应用程序尝试连接的PC时,我期望的理想行为是应用程序等待套接字连接,GUI不会冻结。 我尝试使用类似于当我尝试使用套接字连接时,C#GUI挂起。需要一种分离GUI线程的方法吗?,c#,multithreading,sockets,user-interface,C#,Multithreading,Sockets,User Interface,当我尝试连接套接字时,我需要一种分离GUI线程的方法 当我的应用程序运行时,当lan电缆连接到PC端口时,我的C#代码正确连接,没有任何挂起GUI。没有问题。 但是,当没有Lan端口连接到我的应用程序尝试连接的PC时,我期望的理想行为是应用程序等待套接字连接,GUI不会冻结。 我尝试使用类似于TaskFactory.startnewmethod(Action) 但我发现它成功地解决了GUI挂起问题,但有时无法连接到lan 下面的代码是我解决此问题的最新尝试,但发现效果不佳 try
TaskFactory.startnewmethod(Action)
但我发现它成功地解决了GUI挂起问题,但有时无法连接到lan
下面的代码是我解决此问题的最新尝试,但发现效果不佳
try
{
Thread.Sleep(100);
TcpListener serverSocket = new TcpListener(IPAddress.Any,ports);
clientSocket = default(TcpClient);
int counter = 0;
serverSocket.Start();
counter += 1;
dispatcher.Invoke(new Action(() =>
{
clientSocket = serverSocket.AcceptTcpClient();
}));
MessageBox.Show(ports + " " + "Connected!");
}
catch (Exception w)
{
MessageBox.Show(ports + " " + "Connection error!");
}
需要帮助:当没有lan端口连接到电脑时,当应用程序尝试连接到该端口时,而不是GUI挂起时,它必须优雅地等待。尝试以下操作:
var ports = 1234;
try
{
Thread.Sleep(100);
var serverSocket = new TcpListener(IPAddress.Any, ports);
var clientSocket = default(TcpClient);
int counter = 0;
serverSocket.Start();
counter += 1;
var source = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
while(true)
{
clientSocket = serverSocket.AcceptTcpClient();
MessageBox.Show(ports + " " + "Connected!");
}
}, source.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
catch (Exception w)
{
MessageBox.Show(ports + " " + "Connection error!");
}
您应该使用Async
或Begin
方法(取决于您的环境是否支持Async/await)
由于您只有VS2010,因此应使用:
使用异步工作项是一个好主意。您可能需要尝试Task.Run而不是TaskFactory.StartNew,因为计划程序的某些默认设置可能会使您的工作项无法立即执行。嗨,bob,我当前正在VS 2010 client 4 Profile上运行。好的,让我用您的信息尝试一下:)嗨,oliver上述方法可用于多个客户端套接字?如果是这样,需要做哪些更改?此侦听器已经支持多个客户端,因为它在OnClientConnected()
方法中再次调用.Begin()
方法。例如,在todo注释中,您可以将客户机存储在一个数组中,以便从其他方法访问它,这些方法希望向所有连接的客户机广播一些信息。我如何为每个连接的套接字或代码中的不同线程指定句柄?收到的客户机
是TcpClient
,它具有发送和接收数据所需的所有方法和属性。它不是工作人员。有时会有联系。还有,我该如何检查或忽略插座是否已连接?它不工作。有时会有联系。以及如何检查或忽略套接字是否已连接?@anilgadiyar,在clientSocket=serverSocket.AcceptTcpClient()之后的一行代码>是检查套接字是否已连接的位置。如果需要多个连接,请将AcceptTcpClient
的代码放入循环中。
private void InitializeListiner()
{
var listener = new TcpListener(IPAddress.Any, ports);
listener.Start();
listener.BeginAcceptTcpClient(OnClientConnected, listener);
}
private void OnClientConnected(IAsyncResult asyncResult)
{
var listener = (TcpListener)asyncResult.AsyncState;
var client = listener.EndAcceptTcpClient(asyncResult);
listener.BeginAcceptTcpClient(OnClientConnected, listener);
// ToDo: send and receive data from/to client...
}