C# - 新线程无法启动

Eri*_*tný 0 c# multithreading

我想问你为什么我的方法StartReading没有被触发?我期待在控制台中"测试"文本,但没有出现.

public class Connection
{
    public List<byte[]> ReadBuffer = new List<byte[]>();

    TcpClient ClientLogin;
    NetworkStream StreamLogin;
    DataEncoder NetworkBufferLogin;

    Thread ReadingThread;

    public Connection()
    {
        ClientLogin = new TcpClient("127.0.0.1", 13000);
        StreamLogin = ClientLogin.GetStream();
        NetworkBufferLogin = new DataEncoder(StreamLogin);
        ReadingThread = new Thread(StartReading);
    }

    private void StartReading()
    {
        while (true)
        {
            Console.WriteLine("test");
            byte[] a = NetworkBufferLogin.ReceiveData();
            ReadBuffer.Add(a);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和简单的呼唤

  class Program
{
    static void Main(string[] args)
    {
        Connection test = new Connection();
        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*aim 9

我不是C#guru,但我认为你需要打电话Thread.Start():

 public Connection()
    {
        ClientLogin = new TcpClient("127.0.0.1", 13000);
        StreamLogin = ClientLogin.GetStream();
        NetworkBufferLogin = new DataEncoder(StreamLogin);
        ReadingThread = new Thread(StartReading);
        ReadingThread.Start();
    }
Run Code Online (Sandbox Code Playgroud)

无论如何,使用单个线程进行单个连接是一个非常糟糕的主意.你可能应该使用异步IO(非常简单,使用TPL和async/ await关键字,kudos,.Net),或者至少使用线程池.

您应该将您的计划视为一项业务,并将线程创建为雇用新员工.你会雇佣并为你的企业要求的每项任务解雇一名新员工吗?当然不是.你应雇用一些工人,使他们能够完成你的业务所需的任务.

  • @ErikŠťastný真正的答案是第二段.不要使用线程.使用Stream.ReadAsync和async/await.网络操作不使用线程等待,它们*alreay*异步.实际上,操作系统必须通过阻塞调用线程来模拟同步IO (2认同)