2015-05-28 69 views
0

请看看下面的代码取消/中止任务

List<Task> tasks = new List<Task>();  

static void Main(string[] args) 
{ 
    while (true) 
    { 
     Socket serverSocket = new Socket(SocketType.Stream, ProtocolType.Tcp); 
     serverSocket.Bind(new IPEndPoint(IPAddress.Any, Helper.PORT)); 
     serverSocket.Listen(0); 

     while(true) 
     { 
      Socket clientSocket = serverSocket.Accept(); 

      Client client = new Client(clientSocket); 

      Task t = new Task(delegate { client.Handle(); }); 
      t.Start(); 
      tasks.Add(t); 
     } 
    } 

Client.Handle(): 

while (true) 
{ 
    byte[] buffer = new byte[1024]; 
    clientSocket.Recieve(buffer); 
    //Do Something... 
} 

有什么办法来取消/放弃的时候有在名单超过10个任务的任务?

回答

2

如果你想取消在C#中的任务,你必须添加一个CancellationTokenSource,你可以打电话取消任务

它看起来沿

CancellationTokenSource cts = new CancellationTokenSource(); 
Task t = new Task(() => TaskRun(), cts.Token); 
t.Start(); 
cts.Cancel(); 

线的东西在你的榜样它会更多或更少的如:

// ... 

CancellationTokenSource cts = new CancellationTokenSource(); 
while(true) 
{ 
    Socket clientSocket = serverSocket.Accept(); 
    Client client = new Client(clientSocket); 
    Task t = new Task(() => client.Handle(), cts.Token); 
    t.Start(); 
    tasks.Add(t); 

    if(tasks.Count() >= 10) cts.Cancel(); 
} 

// ... 

但我不太明白你的代码。你有多个无限循环,包括另一个循环内的无限循环。一旦你的代码到达Socket clientSocket...的部分,它将永远不会退出该循环。另外,取消List<Task>中的所有任务将不会删除这些任务,最终会导致内存不足。

如果您只希望完成10个任务,您可以使用像Task[] tasks = new Task[10];这样的任务数组更好,然后当您填充数组时,退出内部循环 - 这也允许您使用for/foreach循环。

+0

非常感谢您的帮助。外部循环监听传入连接,内部循环处理这些连接。 –