2017-10-08 8 views
-1

여러 줄의 텍스트 상자가 있고 각 줄을 다중 스레드로 처리하려고합니다. 이것은 작업을 배우는 예일 뿐이지 만 나중에 인쇄 할 때와 다른 작업을 수행 할 것입니다. 그래서의 이유가 무엇필요 이상의 작업 실행을 방지하는 방법

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 

: 나는 다음과 같은 출력을 얻을

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 
2 
3 
4 
5 
6 
7 
8 
9 
10 

:

예를 들어의 내 텍스트 상자에 포함 된 가정 해 봅시다 많은 "빈 공간"과 여분의 작업이 아무 이유없이 도망 치고 그것을 막는 방법?

도움을 주시면 감사하겠습니다.

+3

당신의 텍스트 상자는뿐만 아니라 당신이 포함하고 각각의 특성을 고려하여, 개행 문자가 포함 된'Lines' 속성을 사용하여 한 번에 각 라인이 소요됩니다. – hnefatl

+0

'txtSearchTerms.Text [tmp] .Trim()'인쇄 –

+0

taks를 제한하려면 (그리고 이것을 향상시키기 위해)'Parallel.For()'를 사용하십시오. 선택 사항으로 MaxDegree 설정을 사용하지만 필요 없다고 생각합니다. –

답변

0

코드의 문제는 txtSearchTerms.Lines 대신 txtSearchTerms.Text을 사용하고 있다는 것입니다.

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

을 난 당신이 작업 동기화 문제를 가지고 생각합니다. 코드는 어떤 방식 으로든 작업을 제어하는 ​​것으로 보이지 않습니다. 내가 변경하는 동안 작업이 실행될 수 있습니다.아마도 .run이 작업을 실행하는 더 좋은 방법일까요? 목표가 동 기적으로 작업을 실행하도록 요청하지 않습니까? https://msdn.microsoft.com/en-us/library/dd321435(v=vs.110).aspx

이 유래 스레드 유용 할 수 있습니다 : Regarding usage of Task.Start() , Task.Run() and Task.Factory.StartNew()