c# - 如何防止线程的两个副本重复方法和变量
问题描述
目前,我有两台客户端计算机将 Kinect 联合数据发送到服务器计算机,但有两个单独的线程运行侦听器,因此 ( theString
) 变量的两个单独副本正在读取数据。有没有办法设置两个不同的变量从两台不同的客户端计算机读取数据,而不是创建一个重复的线程。
public class AsynchIOServer
{
static void Listeners(object state)
{
TcpListener listener = state as TcpListener;
using (Socket socketForClient = listener.AcceptSocket())
{
if (socketForClient.Connected)
{
Console.WriteLine("Client:" + socketForClient.RemoteEndPoint + " now connected to server.");
using (NetworkStream networkStream = new NetworkStream(socketForClient))
using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream))
using (System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream))
{
try
{
while (true)
{
string theString = streamReader.ReadLine();
if (string.IsNullOrEmpty(theString) == false)
{
Console.WriteLine("Message recieved by " + theString);
var result = theString.Split(',');
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
}
Console.WriteLine("Press any key to exit from server program");
Console.ReadKey();
}
public static void Main()
{
TcpListener[] listeners =
{
new TcpListener(15), new TcpListener(10)
};
Console.WriteLine("***********This is Server program***********");
Console.WriteLine("How many clients are going to connect to this server?:");
int numberOfClientsYouNeedToConnect =int.Parse( Console.ReadLine());
foreach (TcpListener listener in listeners)
{
listener.Start();
for (int i = 0; i < numberOfClientsYouNeedToConnect; i++)
{
Thread newThread = new Thread(new ParameterizedThreadStart(Listeners));
newThread.Start(listener);
}
}
}
}
解决方案
使用如下代码的状态对象:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace ConsoleApplication1
{
public class AsynchIOServer
{
public class State
{
public TcpListener listener { get; set; }
public StreamReader streamReader { get; set; }
public StreamWriter streamWriter { get; set; }
public NetworkStream networkStream { get; set; }
public Socket socketForClient { get; set; }
}
static void Listeners(object obj)
{
State state = obj as State;
using (state.socketForClient = state.listener.AcceptSocket())
{
if (state.socketForClient.Connected)
{
Console.WriteLine("Client:" + state.socketForClient.RemoteEndPoint + " now connected to server.");
using (state.networkStream = new NetworkStream(state.socketForClient))
using (state.streamWriter = new System.IO.StreamWriter(state.networkStream))
using (state.streamReader = new System.IO.StreamReader(state.networkStream))
{
try
{
while (true)
{
string theString = state.streamReader.ReadLine();
if (string.IsNullOrEmpty(theString) == false)
{
Console.WriteLine("Message recieved by " + theString);
var result = theString.Split(',');
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
}
Console.WriteLine("Press any key to exit from server program");
Console.ReadKey();
}
public static void Main()
{
State[] states = new State[] {
new State() { listener = new TcpListener(15)},
new State() { listener = new TcpListener(10)}
};
Console.WriteLine("***********This is Server program***********");
Console.WriteLine("How many clients are going to connect to this server?:");
int numberOfClientsYouNeedToConnect = int.Parse(Console.ReadLine());
foreach (State state in states)
{
state.listener.Start();
for (int i = 0; i < numberOfClientsYouNeedToConnect; i++)
{
Thread newThread = new Thread(new ParameterizedThreadStart(Listeners));
newThread.Start(state);
}
}
}
}
}
推荐阅读
- c# - 我需要参考哪些包来创建我自己的 NUnit 控制台运行器?
- android - 尽管仍然显示 Activity,但 AsyncTask 中的 WeakReference 无效
- php - 部署几周后,Laravel 应用程序初始化缓慢
- python - 将自定义 css 类添加到 DataFrame 的列(或单元格)
- excel - 不同模块中的相同常量名称
- perl - UNIX - 根据主列比较 2 个文件
- android - 程序类型已经存在 :: com.google.firebase.analytics.FirebaseAnalytics$UserProperty
- reactjs - Redux 简写 `mapDispatchToProps` 返回未定义的 `async` 动作/thunk
- saucelabs - 如何将测试场景设置为在 Webdriver.io 测试对象中同时运行?
- c# - 有什么方法可以在 .NET Core 上使用 ABBYY FRE