取消/中止任务
Cancel / Abort Tasks
请看下面的代码
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 个时,有什么方法可以取消/中止任务吗?
如果你想在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 循环。
请看下面的代码
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 个时,有什么方法可以取消/中止任务吗?
如果你想在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 循环。