C# 我们可以在循环中使用异步方法调用吗

C# 我们可以在循环中使用异步方法调用吗,c#,asp.net,multithreading,.net-4.0,C#,Asp.net,Multithreading,.net 4.0,我想通过使用线程优化性能 public delegate int DelegateGetMarkOfSubject(int subjectid, int studentid); int TotalMark = 0; public void GetTotalMark(int StudentId) { TotalMark = 0; List<Subjects> lstSubj = GetSubjectList(StudentId); Waithand

我想通过使用线程优化性能

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
    }
}
public delegategetmarkof subject(int subjectid,int studentid)中的公共委托;
int TotalMark=0;
公共无效GetTotalMark(国际学生ID)
{
TotalMark=0;
List lstsubc=GetSubjectList(StudentId);
Waithandle[]waitHandler=新的waitHandler[10];
DelegateGetMarkOfSubject delmarkOfSubj=新建DelegateGetMarkOfSubject(GetMark);
foreach(LSTSub中的var主体)
{
IAsync result_subject.id=delmarkOfSubj.BeginInvoke(subject.id,StudentId,new AsyncCallBack(GetMarkComplete),null);
add(result\u subject.id.asynchHandle);
}
WaitHandle.WaitAll(waitHandler);
返回TotalMark;
}
GetMarkComplete(Iasynch参数)
{
DelegateGetMarkOfSubject del=(DelegateGetMarkOfSubject)((Asynchresult ar)).AsynDelegate;
newMark=del.EndInvoke(参数)
if(锁定条件)
{
//普特洛克
TotalMark+=新马克;
//释放锁
}
}

为什么不使用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));
课程主题
{
公共Int32标记{get;set;}
}
var主题=新列表
{
新科目{Mark=50},
新主题{Mark=75},
新主题{Mark=81},
};
Console.WriteLine(subjects.AsParallel().Sum(subject=>subject.Mark));

以下是您的代码的反应式框架(Rx)版本:

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

这也产生了并行的结果。

我没有看到这个问题。听起来非常适合.Net 5。。。等待!我正要补充一个非常相似的答案。普林克真是太完美了。OP也可以考虑使用RX(System,Read)作为替代方案。