Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 取消/中止任务_C#_Multithreading_Network Programming_Task - Fatal编程技术网

C# 取消/中止任务

C# 取消/中止任务,c#,multithreading,network-programming,task,C#,Multithreading,Network Programming,Task,请看下面的代码 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.A

请看下面的代码

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...
}
List tasks=newlist();
静态void Main(字符串[]参数)
{
while(true)
{
Socket serverSocket=新套接字(SocketType.Stream,ProtocolType.Tcp);
Bind(新的IPEndPoint(IPAddress.Any,Helper.PORT));
serverSocket.Listen(0);
while(true)
{
Socket clientSocket=serverSocket.Accept();
客户端=新客户端(clientSocket);
Task t=新任务(委托{client.Handle();});
t、 Start();
任务。添加(t);
}
}
Client.Handle():
while(true)
{
字节[]缓冲区=新字节[1024];
clientSocket.receive(缓冲区);
//做点什么。。。
}

当列表中有10个以上的任务时,有没有办法取消/中止该任务?

如果要取消c#中的任务,您必须添加一个
取消令牌源
,您可以调用它来取消该任务

它看起来像是一个

CancellationTokenSource cts=新的CancellationTokenSource();
Task t=新任务(()=>TaskRun(),cts.Token);
t、 Start();
cts.Cancel();
在您的示例中,大致如下所示:

但是我不太理解你的代码。你有多个无限循环,包括另一个循环中的无限循环。一旦你的代码到达
Socket clientSocket…
的部分,它将永远不会离开该循环。此外,取消
列表中的所有任务将不会删除这些任务,你最终会退出n内存不足


如果您只希望完成10项任务,那么最好使用设置好的任务数组,如
task[]tasks=newtask[10]
然后在填充数组时,退出内部循环--这也允许您使用for/foreach循环。

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

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();
}

// ...