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# C-新线程未启动_C#_Multithreading - Fatal编程技术网

C# C-新线程未启动

C# C-新线程未启动,c#,multithreading,C#,Multithreading,我想问你为什么我的方法StartReading没有被触发?我希望控制台中有测试文本,但什么也没有出现 public class Connection { public List<byte[]> ReadBuffer = new List<byte[]>(); TcpClient ClientLogin; NetworkStream StreamLogin; DataEncoder NetworkBufferLogin; Thre

我想问你为什么我的方法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);
        }
    }
}

我不是C大师,但我认为您需要调用线程。开始:

无论如何,使用单个线程进行单个连接是一个非常糟糕的主意。您可能应该使用异步IO,它对于TPL和async/await关键字、.Net非常简单和方便,或者至少使用线程池


你应该把你的计划看作是一个企业,把线程的创建看作是雇佣一个新员工。你会为你的业务需要的每一项任务雇佣并解雇一名全新的员工吗?当然不是。你应该雇佣一些工人,让他们完成你的业务需要的任务

您忘记启动线程:

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

您需要调用方法启动

 ReadingThread = new Thread(StartReading);
 ReadingThread.Start();
我还建议使用背景踏板

ReadingThread = new Thread(StartReading) {IsBackground = true};
ReadingThread.Start();

这将有助于避免在主线程完成后冻结程序。

考虑使用其启动方法启动线程。使用异步流方法代替线程,例如。异步网络方法将工作卸载到操作系统上,并且不消耗任何线程,从而产生更好的性能和更简单、更安全的代码。对于下一个投票者,拼写错误是关闭的原因,而不是下一个投票者!否决票是针对坏问题的,当然你是对的。。。真蠢forgotten@Erik真正的答案是第二段。不要使用线程。使用Stream.ReadAsync和async/await。网络操作不使用线程等待,它们总是异步的。事实上,操作系统必须通过阻止调用threadyep+来模拟同步IO,但我不知道这个方法在做什么,我需要先检查一下:如果我理解正确,Anync方法的工作原理与普通读取方法相同,但不会冻结线程?@ErikŠťastný正是这样。然后,您可以使用少量线程,让它们在新连接上工作,或者在IO完成后继续在旧连接上工作。我认为Thread.Sleepint是一种静态方法,用于执行睡眠操作的线程内部。Like new Thread=>{whiletrue{Thread.Sleep1000;}}}.Start;因此,它不能用作实例成员函数。
ReadingThread = new Thread(StartReading);
ReadingThread.Start(); // to start your thread
ReadingThread.Stop(); // to stop your thread
ReadingThread.Sleep(2000); // to sleep(miliseconds) your thread
 ReadingThread = new Thread(StartReading);
 ReadingThread.Start();
ReadingThread = new Thread(StartReading) {IsBackground = true};
ReadingThread.Start();