簡體   English   中英

在C#中動態運行多個線程

[英]Dynamically run more than one thread in c#

我有一個程序,需要同時運行多個線程

int defaultMaxworkerThreads = 0;
int defaultmaxIOThreads = 0;
ThreadPool.GetMaxThreads(out defaultMaxworkerThreads, out defaultmaxIOThreads);
ThreadPool.SetMaxThreads(defaultMaxworkerThreads, defaultmaxIOThreads);

List<Data1> Data1 = PasswordFileHandler.ReadPasswordFile("Data1.txt");
List<Data1> Data2 = PasswordFileHandler.ReadPasswordFile("Data2.txt");
while (Data1.Count >= 0)
{

    List<String> Data1Subset = (from sub in Data1 select sub).Take(NumberOfWordPrThead).ToList();
   Data1 = _Data1.Except(Data1Subset ).ToList();
   _NumberOfTheadsRunning++;
   ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadCompleted), new TaskInfo(Data1Subset , Data2 ));
    //Start theads based on how many we like to start
}

如何一次運行多個線程? 我想根據內核數和配置設置來確定運行時的線程數,但是我的代碼似乎總是只運行一個線程。

如何更改它以在多個線程上運行?

正如@TomTom所指出的,如果同時設置SetMinThreadsSetMaxThreads ,則代碼將正常工作。 根據MSDN,您還必須注意不要在執行ThreadPool之前過早退出主線程:

// used to simulate different work time
static Random random = new Random();
// worker
static private void callback(Object data) 
{
   Console.WriteLine(String.Format("Called from {0}", data));
   System.Threading.Thread.Sleep(random.Next(100, 1000));
}
//
int minWorker, minIOC;
ThreadPool.GetMinThreads(out minWorker, out minIOC);
ThreadPool.SetMaxThreads(5, minIOC);
ThreadPool.SetMinThreads(3, minIOC);
for(int i = 0; i < 3; i++)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(callback), i.ToString());
}
// give the ThreadPool a change to run
Thread.Sleep(1000);

任務並行庫是標准ThreadPool的很好替代方案,它引入了任務的概念。 例如,使用Task對象,您可以輕松地啟動多個任務,如下所示:

// global variable
Random random = new Random(); // used to simulate different work time

// unit of work
private void callback(int i)
{
    Console.WriteLine(String.Format("Nr. {0}", i));
    System.Threading.Thread.Sleep(random.Next(100, 1000));
}   

const int max = 5;
var tasks = new System.Threading.Tasks.Task[max];
for (int i = 0; i < max; i++)
{
    var copy = i;
    // create the tasks and init the work units
    tasks[i] = new System.Threading.Tasks.Task(() => callback(copy));
}
// start the parallel execution
foreach (var task in tasks)
{
    task.Start();
}
// optionally wait for all tasks to finish
System.Threading.Tasks.Task.WaitAll(tasks);

您還可以使用Task.Factory立即開始執行代碼,如下所示:

const int max = 5;
var tasks = new System.Threading.Tasks.Task[max];
for (int i = 0; i < max; i++)
{
    var copy = i;
    // start execution immediately
    tasks[i] = System.Threading.Tasks.Task.Factory.StartNew(() => callback(copy));
}
System.Threading.Tasks.Task.WaitAll(tasks);

看看這篇SO帖子 ,看看ThreadPool.QueueUserWorkItem與Task.Factory.StartNew之間的區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM