私は小さなマルチスレッドネットワークサーバーを書いています。すべての古典的なもの:着信接続をリッスンし、それらを受け入れてから、異なるスレッドでそれらを提供します。また、このサーバーは再起動する必要がある場合があります。そのためには、a)リスニングを停止し、b)接続されているすべてのクライアントをキックアウトし、c)設定/待機を調整し、d)リスニングを再開する必要があります。
ええと、私はマルチスレッドプログラムの開発についてほとんど知らないので、助けを求めています。これが私がやってきたことです(コアのもののみ):
class Server
{
class MyClient
{
Server server;
TcpClient client;
bool hasToFinish = false;
public MyClient(Server server, TcpClient client)
{
this.server = server;
this.client = client;
}
public void Go()
{
while (!hasToFinish)
{
// do all cool stuff
}
CleanUp();
}
private void CleanUp()
{
// finish all stuff
client.Close();
server.myClients.Remove(this);
}
public void Finish()
{
hasToFinish = true;
}
}
bool running = false;
TcpListener listener;
HashSet<MyClient> myClients = new HashSet<MyClient>();
public void Start()
{
if (running)
return;
myClients.Clear();
listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1234);
listener.Start();
listener.BeginAcceptTcpClient(AcceptClient, this);
running = true;
}
public void Stop()
{
if (!running)
return;
listener.Stop();
foreach (MyClient client in myClients)
{
client.Finish();
}
myClients.Clear();
running = false;
}
public void AcceptClient(IAsyncResult ar)
{
MyClient client = new MyClient(this, ((TcpListener)ar.AsyncState).EndAcceptTcpClient(ar));
myClients.Add(client);
client.Go();
}
}
それは絶対に不十分です。同期はありません(どこに配置すればよいかわかりません!)。Server.Stop()を呼び出しても、MyClient-sはすぐに停止しません。これらの問題を解決するにはどうすればよいですか?