私はC#ソケットサーバーを構築しています。私のコードは現在動作していますが、これが正しい方法であるかどうかはわかりません。スレッド管理の正しい方法
TcpClient
が接続されている場合は、次のメソッドを使用して新しいオブジェクトに入れます。Init()
を呼び出して、データが利用可能かどうかのチェックを開始します。
public void Init()
{
ThreadPool.QueueUserWorkItem(Read);
}
private void Read(object state)
{
if (IsClientConnected())
{
if (_connected.Available > 0)
{
OnDataAvailable(_connected.Available);
}
Init();
}
}
ReadInt32(), ReadByte(), ReadString() ReadObject<T>()
のように、私が作成したメソッドを使用して、私はここに
While
ループを使用すべきか、私が現在やっているよう
Init()
を再起動する必要がありますか?それで
ThreadPool
の代わりに
BackgroundWorker
,
Thread
、または
Task
を使用する必要がありますか?
私もBeginWait(some sort of callback here)
にInit()
を変更し、Read()
内Init()
の除去を考えていたし、必要な
私の目的は、コマンドに耳を傾け、コマンドに応答するのですその後、もう一度BeginWait
を呼び出します。 x個のクライアントが同時に接続されている。
ので、シナリオは以下の通りです:
私は、サーバーに接続するアプリケーションを持っています。 次に、TcpClientを新しいオブジェクトにコンストラクタのパラメータとして初期化します。次に、サーバーは、接続されたクライアントを別のクライアントがある部屋に追加します。この部屋には、ソケットを読むための正しい方法はそれから読むことです
private void Client_DataAvailable(ClientWrapper sender, int data)
{
var command = (Commands)Client.ReadByte();
switch (command)
{
case Commands.RequestConnectId: // 1
var buffer = new WriteBuffer(Commands.RequestConnectId);
buffer.WriteInt32(sender.ConnectId);
sender.Reply(buffer);
break;
case Commands.WriteText: //2
var buffer = new WriteBuffer(Commands.WriteText);
buffer.WriteString(sender.ReadString());
BroadCast(sender.ConnectId,buffer);//Send to the other client
break;
}
}
C#5でのスレッドを処理する正しい方法は、I/OのためAT ALLスレッドしないことです。代わりに、非同期に 'async'と' await'を使います。 – Aron
私は 'async'' await'を適用するためにこれをどのようにすることができますか提案私は何をしているの詳細について私の質問を編集しています –
あなたの質問はStackOverflowで受け入れられる質問の範囲を超えています。残念ながら、どのSEネットワークがこの質問に適しているかをあなたにアドバイスすることはできません。 – Aron