Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中多线程运行一个命令#_C#_Multithreading - Fatal编程技术网

C# 如何在C中多线程运行一个命令#

C# 如何在C中多线程运行一个命令#,c#,multithreading,C#,Multithreading,我正在尝试做一个程序,可以模拟500个连接(HTTP请求)到一个网站。因此,我想知道如何将http请求函数组合起来并一起运行,而不必通过许多命令手动创建许多线程。你的意思是 for(int i=0;i<500;i++) { Task.Run(()=>YourFunc()); } for(int i=0;iYourFunc()); } 你的意思是什么 for(int i=0;i<500;i++) { Task.Run(()=>YourFunc()); } for

我正在尝试做一个程序,可以模拟500个连接(HTTP请求)到一个网站。因此,我想知道如何将http请求函数组合起来并一起运行,而不必通过许多命令手动创建许多线程。

你的意思是

for(int i=0;i<500;i++)
{
  Task.Run(()=>YourFunc());
}
for(int i=0;iYourFunc());
}
你的意思是什么

for(int i=0;i<500;i++)
{
  Task.Run(()=>YourFunc());
}
for(int i=0;iYourFunc());
}

使用TPL中的TaskFactory.FromAsync尝试下面的代码

创建一个任务,该任务表示一对begin和end方法 符合异步编程模型模式

如果您正在运行控制台应用程序,您应该等待使用
Task.WaitAll来完成所有并行任务

        var tasks = new List<Task>();

        for (int i = 0; i < 500; i++)
        {
            tasks.Add(Task.Run(async () =>
            {
                var request = WebRequest.Create("http://www.example.com");
                var response = (HttpWebResponse)await Task.Factory
                                    .FromAsync<WebResponse>(request.BeginGetResponse,
                                    request.EndGetResponse,
                                    null);
                Console.WriteLine($"Request {i} status is {response.StatusCode}");

            }));
       }

       try
       {
            // Wait for all the tasks to finish.
            Task.WaitAll(tasks.ToArray());
       }
       catch (AggregateException e)
       {
            for (int j = 0; j < e.InnerExceptions.Count; j++)
            {
                Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString());
            }
       }

使用TPL中的TaskFactory.FromAsync尝试下面的代码

创建一个任务,该任务表示一对begin和end方法 符合异步编程模型模式

如果您正在运行控制台应用程序,您应该等待使用
Task.WaitAll来完成所有并行任务

        var tasks = new List<Task>();

        for (int i = 0; i < 500; i++)
        {
            tasks.Add(Task.Run(async () =>
            {
                var request = WebRequest.Create("http://www.example.com");
                var response = (HttpWebResponse)await Task.Factory
                                    .FromAsync<WebResponse>(request.BeginGetResponse,
                                    request.EndGetResponse,
                                    null);
                Console.WriteLine($"Request {i} status is {response.StatusCode}");

            }));
       }

       try
       {
            // Wait for all the tasks to finish.
            Task.WaitAll(tasks.ToArray());
       }
       catch (AggregateException e)
       {
            for (int j = 0; j < e.InnerExceptions.Count; j++)
            {
                Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString());
            }
       }

只需创建500个
async
请求,不要等待它们。然后使用
Task.whalll
。您现在已经从线程中抽象出来了。只需创建500个
async
请求,而不必等待它们。然后使用
Task.whalll
。您现在已从线程中抽象出来。但您从不等待运行的任务。@john正确,但我不知道OP main Thread我仍然认为您应该以某种方式演示等待。想象一下,他正在一个控制台应用程序中执行此操作。它将在所有请求完成之前退出。@john,我当然会编辑它,谢谢,但您从不等待运行的任务。@john,没错,但我不知道OP main Thread。我仍然认为您应该以某种方式演示等待。想象一下,他正在一个控制台应用程序中执行此操作。它将在所有请求完成之前退出。@john,我当然会编辑它,谢谢