正确启动多线程c#执行

正确启动多线程c#执行,c#,multithreading,C#,Multithreading,告诉我什么是启动方法的多线程执行的正确方法,我需要在100个线程中启动方法(程序)的执行。 例如,我需要从列表中获取代理并检查200响应 如何在100个线程中正确运行程序 //Array Threads for (int j = 0; j < 100; j++) { arrThread[j] = new Thread(new ThreadStart(new Worck().SearchUrls)); arrTh

告诉我什么是启动方法的多线程执行的正确方法,我需要在100个线程中启动方法(程序)的执行。 例如,我需要从列表中获取代理并检查200响应


如何在100个线程中正确运行程序

//Array Threads
        for (int j = 0; j < 100; j++)
        {
            arrThread[j] = new Thread(new ThreadStart(new Worck().SearchUrls));
            arrThread[j].IsBackground = true;
            arrThread[j].Start();
        }

//Array Tasks
        for (int j = 0; j < 100; j++)
        {
            arrTask[j] = new Task(new Worck().SearchUrls);
            arrTask[j].Start();
        }

//Task
        await Task.Run(() =>
        {
            for (int j = 0; j < 100; j++)
            {
                new Task(() => new Worck().SearchUrls()).Start();
            }
        });

//Parallel
        await Task.Run(() =>
        {
            Parallel.For(1, 100, new Worck().SearchUrls());
        });
//数组线程
对于(int j=0;j<100;j++)
{
arrThread[j]=新线程(新线程开始(new-Worck().searchURL));
arrThread[j].IsBackground=true;
arrThread[j].Start();
}
//数组任务
对于(int j=0;j<100;j++)
{
arrTask[j]=新任务(new work().searchURL);
arrTask[j].Start();
}
//任务
等待任务。运行(()=>
{
对于(int j=0;j<100;j++)
{
新任务(()=>newwork().searchURL()).Start();
}
});
//平行的
等待任务。运行(()=>
{
Parallel.For(1100,newworck().searchURL());
});

如何在100个线程中正确运行程序

//Array Threads
        for (int j = 0; j < 100; j++)
        {
            arrThread[j] = new Thread(new ThreadStart(new Worck().SearchUrls));
            arrThread[j].IsBackground = true;
            arrThread[j].Start();
        }

//Array Tasks
        for (int j = 0; j < 100; j++)
        {
            arrTask[j] = new Task(new Worck().SearchUrls);
            arrTask[j].Start();
        }

//Task
        await Task.Run(() =>
        {
            for (int j = 0; j < 100; j++)
            {
                new Task(() => new Worck().SearchUrls()).Start();
            }
        });

//Parallel
        await Task.Run(() =>
        {
            Parallel.For(1, 100, new Worck().SearchUrls());
        });
我通常建议使用可用的最高级别API

在本例中,
Parallel.For
是最高级别的API。
Parallel
类型将其工作拆分为
Task
s,这些任务分布在线程池中的线程之间

手动创建
线程
对象应该非常罕见;如今,只有当您正在进行COM互操作之类的工作时,才有必要使用它

例如,我需要从列表中获取代理并检查200响应

在这种情况下,问题是错误的。这样做不需要100个线程。或者任何显式线程

因为操作是I/O绑定的,所以您需要的是异步解决方案。首先,编写一个适当的异步
SearchUrlsAsync
(例如,通过进行异步网络调用)。然后,您可以启动所有异步操作,然后异步等待它们全部完成:

var tasks = Enumerable.Range(0, 100).Select(_ => new Worck().SearchUrlsAsync()).ToList();
await Task.WhenAll(tasks);

? 我强烈推荐,以及阅读和阅读。以及学习如何使用搜索引擎和如何阅读一般手册。启动100个线程听起来是个糟糕的主意,尤其是对于检查URL的东西,它本质上不是CPU限制的操作。不使用任务。在并行机上运行。是否冗余和无用?@OlivierRogier:如果调用线程是UI线程,则不会。@OlivierRogier:
Parallel.For
在多个线程池线程之间拆分其工作,并将其当前线程登记为“工作线程”之一线程,直到并行工作完成。因此,如果当前线程是UI线程,则UI将被冻结,直到工作完成。