2012-05-15 3 views
1

스레딩을 사용하여 성능을 최적화하고 싶습니다.루프 내에서 비동기 메서드 호출을 사용할 수 있습니까?

public delegate int DelegateGetMarkOfSubject(int subjectid, int studentid); 

int TotalMark = 0; 

public void GetTotalMark(int StudentId)  
{ 
    TotalMark = 0; 

    List<Subjects> lstSubj = GetSubjectList(StudentId); 
    Waithandle[] waitHandler = new waitHandler[10]; 

    DelegateGetMarkOfSubject delmarkOfSubj = new DelegateGetMarkOfSubject(GetMark); 

    foreach(var subject in lstSubj) 
    { 
     IAsync result_subject.id = delmarkOfSubj.BeginInvoke(subject.id, StudentId, new AsyncCallBack(GetMarkComplete), null); 
     waitHandler.add(result_subject.id.AsyncHandle); 
    } 

    WaitHandle.WaitAll(waitHandler); 
    return TotalMark; 
} 


GetMarkComplete(Iasynch argument) 
{ 
    DelegateGetMarkOfSubject del = (DelegateGetMarkOfSubject)((Asynchresult ar)).AsynDelegate; 

    newMark = del.EndInvoke(argument) 

    if(LockingCondition) 
    { 
     //PutLock 

     TotalMark += newMark; 

     //Release Lock 
    } 
} 
+1

나는 그 질문을 보지 못하고있다. – robrich

+0

http://codereview.stackexchange.com/ –

+1

.Net 5 ...에 딱 맞는 소리가납니다.()! –

답변

1

왜 PLINQ를 사용하지 않습니까?

class Subject 
{ 
    public Int32 Mark { get; set; } 
} 

     var subjects = new List<Subject> 
     { 
      new Subject { Mark = 50 }, 
      new Subject { Mark = 75 }, 
      new Subject { Mark = 81 }, 
     }; 

     Console.WriteLine(subjects.AsParallel().Sum(subject => subject.Mark)); 
+0

방금 ​​비슷한 답변을 추가하려고했습니다. PLINQ는 꽤 완벽합니다. 영업 사원은 Rx (System.Reactive)를 대안으로 사용할 수도 있습니다. – Enigmativity

0

여기에 코드의 반응성 프레임 워크 (수신) 버전입니다 :

var totalMarks = (
    from subject in lstSubj.ToObservable() 
    from mark in Observable.Start(() => GetMark(subject.id, StudentId)) 
    select mark).Sum().Last(); 

이 너무 병렬 결과를 생성합니다.

관련 문제