2015-05-28 98 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

非常感謝您的幫助。外部循環監聽傳入連接,內部循環處理這些連接。 –