2014-08-29 7 views
2

내가이 Class 있습니다액션에서 문자열 매개 변수를 전달하는 방법은 무엇입니까?

public class PCQueue : IDisposable 
{ 
    public delegate void OnFileAddDelegate(string file); 
    public event OnFileAddDelegate OnFileAddEventHandler; 
    BlockingCollection<Action> _taskQ = new BlockingCollection<Action>(); 
    public PCQueue (int workerCount) 
    { 
    // Create and start a separate Task for each consumer: 
    for (int i = 0; i < workerCount; i++) 
     Task.Factory.StartNew (Consume); 
    } 

    public void Dispose() { _taskQ.CompleteAdding(); } 

    public void EnqueueTask (Action action) { _taskQ.Add (action); } 

    void Consume() 
    { 
    // This sequence that we’re enumerating will block when no elements 
    // are available and will end when CompleteAdding is called. 
    foreach (Action action in _taskQ.GetConsumingEnumerable()) 
     action();  // Perform task. 
    } 
} 

을 그리고 난 내가 내 Queue에 추가 할 string[]을 가지고 있고 그 후 내가 원하는 내 Consume() 처리하기 위해이 파일을 얻을.

string[] files; 

PCQueue pq = new PCQueue(1); 
foreach (string item in files) 
    pq.EnqueueTask(item); 

이 오류가 있습니다

Checker checker = new Checker(); 
string result = Checker.Check(my file from the Queue); 
if (result != null && OnFileAddEventHandler != null) 
    OnFileAddEventHandler(result); 

그리고 만약 : 나는이 파일을 확인 오전 내 Queue에서 파일을 넣어 한 후 'System.Action'에서 '문자열'

에서 변환 할 수 없습니다 이 파일은 괜찮습니다. 내 양식에 이벤트를 발생 시켰습니다.

+0

확실히 대기열에 작업이 아닌 데이터가 있어야합니까? –

+0

@MatthewWatson 아니, 전체 요점은 미리 정의 된 수의 작업자가있는 파일 컬렉션을 처리하는 것 같아서,'Action '처리가 큐에 저장되거나'Action's의 대기열 중 하나입니다. – AndreySarafanov

+0

@AndreySarafanov이 경우 작업 배열을 만들고 Parallel.Invoke()를 사용하여 작업을 시작하고 작업 항목에 BlockingCollection을 사용하면됩니다. –

답변

0

귀하의 의도를 올바르게 이해하면 Action에 매개 변수를 추가 할 필요가 없습니다. 필요한 것은 방법을 변경하는 것입니다. 당신은 EnqueueTask 메서드를 호출합니다. 당신이 ProcessFile(string filename) 방법의 실행을 대기열하려는 경우 예를 들어 , 당신이 당신의 코드를 변경해야합니다 :

foreach (string item in files) 
{ 
    string filename = item; 
    pq.EnqueueTask(() => ProcessFile(filename)); 
} 

filename 변수가 foreach 루프 변수를 통해 폐쇄 방지하는 것입니다 수 있도록 그 이유를, 어떤 수 this 브릴리언트 기사에서 더 자세히 설명했듯이 사용하는 C# 버전에 따라 해로울 수 있습니다.

UPD .: PCQueue 클래스가하는 일을 오해하는 것 같습니다. 그 일은 파일 이름을 저장하는 것이 아니라 Action을 저장하고 Consume() 메소드를 통해 모든 것을 실행하는 것입니다. 이 작업은 파일과 관련 될 필요는 없으며 아무 것도 될 수 있습니다.

하지만 실제로는 PCQueue이 작업에 필요하지 않습니다. 사용하는 방식에 따라 파일을 반복하는 것만으로는 효과적이지 않습니다.

Checker checker = new Checker(); 
foreach (string item in files) 
{ 
    string result = Checker.Check(my file from the Queue); 
    if (result != null && OnFileAddEventHandler != null) 
    { 
     OnFileAddEventHandler(result); 
    } 
} 
+2

은'Action '이 아니어야합니까? – Marco

+0

@Serv 어쩌면 내가 잘못 된 방법을 이해했을지 모르지만, maya remetz가'string '을'PCQueue'클래스에 추가하여'_taskQ'의 각 요소가 해당 매개 변수와 함께 호출되도록하려는 것 같습니다 그 컬렉션에서. – AndreySarafanov

+0

그리고 EnqueueTask를 호출 할 때 무엇을해야합니까? 내가 string [] arr 있고 foreach 루프 안에 그냥 항목을 전달하고 작업 문자열을 변환 할 수 없습니다

관련 문제