c#中奇怪的多线程行为
本文关键字:多线程 | 更新日期: 2023-09-27 18:11:21
我有一个侦听线程函数,它等待传入的连接并为每个客户端启动一个新线程。当每次启动一个新线程时,它都会在日志中写入"1":
void ListenWorkerDoWork(object sender, DoWorkEventArgs e) {
try {
var tcpListener = new TcpListener(IPAddress.Any, 843);
tcpListener.Start();
var worker = sender as BackgroundWorker;
if (worker != null) {
while (!worker.CancellationPending) {
var client = tcpListener.AcceptTcpClient();
var clientThread = new Thread(HandleClientComm) { IsBackground = true };
clientThread.Start(client);
Logger.Instance.WriteToLog(Logger.Type.Info, "1");
}
}
} catch (Exception ex) {
Logger.Instance.WriteToLog(Logger.Type.Error, string.Format("An error has occured while listening on port 843:{0}{1}", Environment.NewLine, ex));
}
}
和客户端处理线程,它将"2"写入日志文件并处理传入的连接:
private void HandleClientComm(object client) {
Logger.Instance.WriteToLog(Logger.Type.Info, "2");
[...]
}
我也有一个小的应用程序连接到服务器每50毫秒和发送/接收一些数据。如果我只启动一个客户端,那么"1"answers"2"的数量是相等的,但是如果我在不同的计算机上启动几个客户端实例,那么"2"的数量比"1"高5%。这意味着我的客户端线程的过程被调用的次数比实际请求的多5%。这怎么可能呢?例如,我有3个客户。每个客户端与服务器执行1000个会话。结果是:
- 客户端3000次成功会话
- 3119侦听套接字接受的连接数(并写入"1")
- 3273次客户端线程函数调用
谢谢!
更新:
日志写入功能是线程安全的:
public void WriteToLog(Type type, object message) {
lock(writelock) {
String str = typeText[(int)type] + DateTime.Now.ToString() + " : " + message.ToString();
Console.WriteLine(str);
if (stream != null) {
stream.WriteLine(str);
stream.Flush();
}
}
}
重新启动Visual Studio并重建项目后,问题自行解决。我不知道该说什么。