2017-10-08 94 views
-1

我有一个多行文本框,我想用多线程处理每一行。这仅仅是一个学习任务的例子,但我将在之后的工作中做不同的任务,而不仅仅是打印它们。如何防止执行比需要更多的任务

例如假设我的文本框包含:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

使用下面的代码:

List<Task> tasks = new List<Task>(); 

    for (int i = 0; i < txtSearchTerms.Text.Length; i++) 
    { 
     int tmp = i; 
     Task t = new Task(() => 
         { 
          Console.WriteLine(txtSearchTerms.Text[tmp]); 
         }); 
     tasks.Add(t); 
     t.Start(); 
    } 

    Task.WaitAll(tasks.ToArray()); 

    foreach(Task t in tasks) 
    { 
     Console.WriteLine("Task {0}, Status {1}", t.Id, t.Status); 
    } 

我得到以下输出:

1 




3 




4 




5 




6 




7 




8 




9 




1 
0 
2 
Task 1, Status RanToCompletion 
Task 2, Status RanToCompletion 
Task 3, Status RanToCompletion 
Task 4, Status RanToCompletion 
Task 5, Status RanToCompletion 
Task 6, Status RanToCompletion 
Task 7, Status RanToCompletion 
Task 8, Status RanToCompletion 
Task 9, Status RanToCompletion 
Task 10, Status RanToCompletion 
Task 11, Status RanToCompletion 
Task 12, Status RanToCompletion 
Task 13, Status RanToCompletion 
Task 14, Status RanToCompletion 
Task 15, Status RanToCompletion 
Task 16, Status RanToCompletion 
Task 17, Status RanToCompletion 
Task 18, Status RanToCompletion 
Task 19, Status RanToCompletion 
Task 20, Status RanToCompletion 
Task 21, Status RanToCompletion 
Task 22, Status RanToCompletion 
Task 23, Status RanToCompletion 
Task 24, Status RanToCompletion 
Task 25, Status RanToCompletion 
Task 26, Status RanToCompletion 
Task 27, Status RanToCompletion 
Task 28, Status RanToCompletion 
Task 29, Status RanToCompletion 

什么是如此的原因许多“空白空间”和额外的任务是无缘无故地跑,如何防止它?

任何帮助表示赞赏。

+3

你的文本框将包含换行符,抓住每一个角色你包括那些为好,使用'Lines'财产采取每条线在时间。 – hnefatl

+0

打印'txtSearchTerms.Text [tmp] .Trim()' –

+0

要限制taks(并改进这个),使用'Parallel.For()'。可选MaxDegree设置,但我不认为你需要这样做。 –

回答

0

您的代码问题是您使用的是txtSearchTerms.Text而不是txtSearchTerms.Lines

https://stackoverflow.com/a/46630470/34092考虑使用:

var data = txtSearchTerms.Lines; 
var threadCount = 4; // or whatever you want 

Parallel.ForEach(data, 
    new ParallelOptions() { MaxDegreeOfParallelism = threadCount }, 
    (val) => 
    { 
     //Your code here 
     Console.WriteLine(val); 
    }); 

或:

var data = txtSearchTerms.Lines; 
var threadCount = 4; // or whatever you want 

var results = data.AsParallel(new ParallelLinqOptions() 
{ 
    MaxDegreeOfParallelism = threadCount 
}).Select(val => 
{ 
    // Your code here, I just return the value but you could return whatever you want 
    return val; 
}).ToList();