Tcp应用实例---1.基础知识

来源:互联网 发布:安禄山史思明 知乎 编辑:程序博客网 时间:2024/05/29 14:22

(源码下载地址,http://download.csdn.net/source/406996)

  在进行实际编码之前,有几个概念要先讲一下。

  1。启动一个线程
  .net中,包含线程类的命名空间是using System.Threading,通过这个空间里的类Thread可以启动一个线程,就像下面这样:  

        public class test
        
{
            
private void WaitToMakeFile()
            
{
                
//
            }


            
public void StartAThread()
            
{
                Thread t 
= new Thread(new ThreadStart(WaitToMakeFile));
                t.Start();
            }

        }


 

  由代码可见,有两个地方需要注意。一是类Thread的构造函数需要传递一个ThreadStart的对象作为参数;二是这个ThreadStart类的构造函数需要传递一个无返回类型,无参数的函数的名字作为参数,这里传递的是private void WaitToMakeFile()。
  最后通过Thread.Start()方法来启动线程,线程中实际执行的是函数WaitToMakeFile中的代码。在WaitToMakeFile中的代码执行完毕后,线程退出。

  可能会问,需要向线程中传递参数应该怎么办呢?这需要一种新的思路:

        public class Test
        
{
            
public void StartAThread()
            
{
                TConnectionTest conTest 
= new TConnectionTest("192.168.1.1"9999);
                Thread t 
= new Thread(new ThreadStart(conTest.ConnectionToServer));
                t.Start();
            }

        }


        
private class TConnectionTest
        
{
            
public string serverAddress;
            
public int port;

            
public TConnectionTest(string s, int p)
            
{
                serverAddress 
= s;
                port 
= p;
            }

            
            
public void ConnectionToServer()
            
{
                
//use serverAddress and port
            }

        }


 

  不错,需要定义一个新类,ThreadStart类的参数传递的是这个新类中的无参数无返回值的函数,而需要传入线程的参数则写入到这个类的实例中。

  2。在线程中操作主窗口上的控件。
  在线程中,并不能直接控制主窗口上的控件,因为这些控件并不是在这个线程中产生的,直接操作其他线程的控件可能会产生一些不可预期的错误。应该像下面这样调用:

        private delegate void dd();
  
public void GetFileList()
        
{
        
//get info
                dd a = delegate()
                
{
                    _listBox.Items.Clear();
                    
for (int i = 0; i < command.argList.Count; i++)
                    
{
                        _listBox.Items.Add((
string)command.argList[i]);
                    }

                }
;
                _listBox.Invoke(a);
        }

 

  实际过程是先定义一个委托,然后通过控件的Invoke()方法来调用这个委托。

  3。关于TcpServer、TcpClient的使用,网上的教程、文章一大堆,而这里只是一些简单应用,因此不做讲解。

    ie.2008-04-09

原创粉丝点击