サーバークライアントプロジェクトを作成しています。ここで、サーバーはクライアントの呼び出しに基づいてデータベースに変更を加えます。クライアントの呼び出しは非同期です。イベントを使用して着信呼び出しに基づいていくつかのデリゲートを呼び出しています。以下のコードはあなたにアイデアを与えることができます
public delegate void Client_Logging_In_Delegate(WebSocketSession session, string e);
public event Client_Logging_In_Delegate Admin_Logging_In_Event;
public void Client_Logging_In_Function(WebSocketSession session, string e)
{
//Database -> this particular client status= true
}
public void Main()
{
server.NewMessageReceived += new SessionEventHandler<WebSocketSession, string> (server.WebSocketServer_NewMessageReceived);
server.Client_Logging_In_Event = new Client_Logging_In_Delegate(server.Client_Logging_In_Function);
}
public void WebSocketServer_NewMessageReceived(WebSocketSession session, string e)
{
string type = e.Substring(0, e.IndexOf("#"));
if (type == "Client_Logging_In")
Client_Logging_In_Event(session, e);
}
両方を同じシステムで実行しています。私はまだクラッシュを受けていません。しかし、実際にはクライアント => 5 -> 20 です。問題は、2 つのイベントが同時に到着した場合、何が起こるかということです。
編集:
サーバー部分にサードパーティのライブラリ「SuperWebsocket」を使用しています。これは message_Received イベントを定義します。ドキュメントには、スレッドセーフであると書かれています。私のはシングルスレッドアプリケーションです。サーバー オブジェクトは 1 つだけです。一部の関数 (デリゲートによって呼び出される) には、いくつかの長いコードがあります。たとえば、これを取ります
public void called_By_Some_Delegate(WebSocketSession session, string e)
{
//1) retrieve a big list from database
//2) change the list into a dictionary object
//3) create a string using dictionary object
//4) send this string to the client using the "session" object
}
ここで、同じデリゲート/関数に対して 2 つのイベントが到着したとします。ここで、最初のポイントで関数が実行され、2 番目のポイントで実行されるとします。2 番目が同時に関数にアクセスすると、リストが変更されます。だから、私はクラッシュがあると思います。これは私が理解しなければならない状況です。