2012-04-25 94 views
0

我正在做一个数组的删除,当一个套接字连接已经终止。我很喜欢一个小聊天程序。我从一个用户对象数组中删除一个元素。在主线程上修改变量C#

public class User 
{ 

    private Thread clthread; 
    private string name; 
    private Socket sock; 

    public User(string _name, Thread _thread, Socket _sock) 
    { 
     sock = socket(); 
     clthread = _thread; 
     name = _name; 
     sock = _sock; 
    } 

    private Socket socket() 
    { 
     return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    }//initiaza socket nou 

    public Thread CLThread 
    { 
     get { return clthread; } 
     set { clthread = value; } 
    } 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    public Socket Sock 
    { 
     get { return sock; } 
     set { sock = value; } 
    } 

} 

数组声明如下:

User[] connected = new User[1024]; 

,这就是我如何删除

  private void Disconnection(int id) 
    { 
     User client = connected[id]; 
     for (int i = id; i < no - 1; i++) 
     { 
      connected[i] = connected[i + 1]; 
     } 
     client.Sock.Close(); 
     client.CLThread.Abort(); 


     no--; 
     MessageBox.Show(no.ToString()); 
     //ui clean 

    } 

的问题是,用户阵列计数器在主声明WPF窗口。但我正在执行与每个套接字关联的threa中的删除方法(断开)。

帮助?

+1

你会谈论一个应用程序中的多个线程或关于连接到一个主应用程序的多个应用程序? – HW90 2012-04-25 13:05:18

+0

不能使用列表而不是数组?那么你不需要有数组的计数器。 – Reniuz 2012-04-25 13:08:26

+0

一个应用程序,多线程 – 2012-04-25 13:12:40

回答

1

在我看来,这整个方法需要被序列化,因为你也正在改变客户的数组:

object locker = new object(); // globally visible lock 

... 

private void Disconnection(int id) 
{   
    lock(locker) 
    { 
     User client = connected[id]; 
     for (int i = id; i < no - 1; i++) 
     { 
      connected[i] = connected[i + 1]; 
     } 
     client.Sock.Close(); 
     client.CLThread.Abort(); 

     no--;  
     MessageBox.Show(no.ToString()); 
    } 
    //ui clean 

} 

并请看看你是否可以在阵列更改为更高效!您不仅需要手动跟踪计数器,而且还要从数组中删除O(n)操作。

+0

我认为这有帮助,而且我在减少no(no - )之前杀死了线程,所以显然我停止了线程从我想要减少之前我实际上做到了。非常感谢! – 2012-04-25 14:32:01

+0

哦,我会尽力做一些更有效的事情。这正是我第一次有我的想法。关于如何更有效地做到这一点的任何建议? – 2012-04-25 14:32:53

+0

@ALex Popa:您可以尝试使用“Dictionary ”数据结构,将id映射到User。从哈希表中搜索和删除是不变的(摊销)时间。 – Tudor 2012-04-25 14:42:46

2

在用户数组的计数器周围使用锁定,因为您正在从多个线程递减锁定。

0

这不是直接回答你的问题,因为我只是有几点提出来。

首先,为什么不使用自动属性?相反的:

public Thread CLThread 
{ 
    get { return clthread; } 
    set { clthread = value; } 
} 

尝试

public Thread CLThread { get; set; } 

您可以为您所有的属性做到这一点。

此外,你正在外部暴露断开的细节。您的User类应该有一个公开的Close()方法,用于处理关闭套接字和中止线程。

这就是说,中止线程是邪恶的。您应该使用一种方法,如让事件获得信号时线程正常返回,然后调用线程的Join()方法Close()以等待线程退出。

我同意Reniuz - 使用List<User>,而不是自己管理柜台。