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