2012-05-15 50 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非常完美。 OP也可以考慮使用Rx(System.Reactive)作爲替代方案。 – Enigmativity

0

這裏是你的代碼的反應框架(Rx)的版本:

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

這產生的結果並行了。