繁体   English   中英

取消/中止任务

[英]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];这样的一组任务数组Task[] tasks = new Task[10]; 然后在填充数组时退出内部循环-这也将允许您使用for / foreach循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM