Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我尝试使用套接字连接时,C#GUI挂起。需要一种分离GUI线程的方法吗?_C#_Multithreading_Sockets_User Interface - Fatal编程技术网

当我尝试使用套接字连接时,C#GUI挂起。需要一种分离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

当我尝试连接套接字时,我需要一种分离GUI线程的方法 当我的应用程序运行时,当lan电缆连接到PC端口时,我的C#代码正确连接,没有任何挂起GUI。没有问题。 但是,当没有Lan端口连接到我的应用程序尝试连接的PC时,我期望的理想行为是应用程序等待套接字连接,GUI不会冻结。 我尝试使用类似于
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...
}