0

以下のコードサンプルを使用しています-

Program.cs には、次のようなクライアントのリストがあります。

public static List<Client> clients = new List<Client>();

button1 のクリックのイベント ハンドラーを使用する

 private void button1_Click(object sender, EventArgs e)
 {
     Client client = new Client(combobox1.selecteditem);
     Program.clients.Add(client);
 }

Client.cs

すべての変数は非静的でパブリックです。パケット受信時にクラスが呼び出されるイベントハンドラがあり、このクラスはフィルタリングされて処理されます

次のコードで呼び出されます。

public void recieved(short op, string str, Client c)
{
    switch (op)
    {
        case (short)OpCodes.matches:
        {
            c.something(c, str);
            break;
        }
    }
}

Handler.cs

public void something(Client c, string movement)
{
    if (movement == null)
        c.coords = movement;
    c.freeSpot = true;
}

上記の ^ では、変数がオーバーラップし、すべてのインスタンスで freespot が true になります。

1 つのインスタンスで問題なく動作します。しかし、複数のインスタンスでコンパイルしようとしています。したがって、button_onclickを作成すると、上記を使用して新しいインスタンスが作成されます。

プログラムの実行中、1 つのインスタンスでは問題なく実行されますが、2 つ以上のインスタンスでは変数がMyClass重複し始めます。これを防ぐ方法はありますか?

4

1 に答える 1

0

詳細な状況がなければ断言できませんが、これは同時実行性の問題である可能性があります。リストはスレッドセーフではありません。ConcurrentBag<T>の代わりに使ってみてくださいList<T>

于 2013-04-29T05:17:22.440 に答える