Как сократить время выполнения?Для выполнения ProfileBase GetPropertyValue требуется 40 мс - PullRequest
0 голосов
/ 12 июня 2018

У меня есть следующий код, в котором я создаю список пользовательского класса, используя массив MembershipUser.

Ниже приведен пользовательский класс, список которого создан:

public class userandGroup :IComparable{
    public string id { get; set; }
    public string Name { get; set; }
    public string DisplayName { get; set; }
    public string type { get; set; }
    public int? CompareTo(Object obj)
    {
        if (obj is userandGroup)
            return this.DisplayName.CompareTo((obj as userandGroup).DisplayName);
        return null;
    }

}

Ниже приводитсякод, который заполняет userlist:

MembershipUserCollection tempuserlist = GetProvider("DefaultProfileProvider", applicationName).GetAllUsers(currentPage - 1, pageSize, out totalUsers);
MembershipUser[] userlist = new MembershipUser[totalUsers];
tempuserlist.CopyTo(userlist, 0);

Ниже приведен код, который генерирует список userandGroup (пользовательский класс):

foreach (MembershipUser usr in userlist)
    {
        userandGroup usrgp = new userandGroup();
        usrgp.id = ((Guid)usr.ProviderUserKey).ToString() ;
        usrgp.Name = usr.UserName;
        ProfileBase profile = ProfileBase.Create(usr.UserName);
        profile.Initialize(usr.UserName, true);
        // Following line approximately takes 40ms per loop.
        usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString();
        usrgp.type = "user";
        lst.Add(usrgp);
    }

Как написано в комментарии, строка;

usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString(); 

занимает 40 мсек за один цикл.У меня 40 пользователей на данный момент.Таким образом, выполнение цикла занимает около 1600 мс.Если количество пользователей увеличится, цикл займет ужасное время.

Как можно сократить время выполнения строки или есть какой-либо другой способ получить имя и фамилию пользователя из ProfileBase

1 Ответ

0 голосов
/ 12 июня 2018

Согласно предложению @TyCobb, я использовал цикл Параллельный Foreach.Я обновил цикл следующим образом.

Object obj = new Object();
    Parallel.ForEach(userlist, (usr) =>
    {
        userandGroup usrgp = new userandGroup();
        usrgp.id = ((Guid)usr.ProviderUserKey).ToString();
        usrgp.Name = usr.UserName;
        ProfileBase profile = ProfileBase.Create(usr.UserName);
        profile.Initialize(usr.UserName, true);
        usrgp.type = "user";
        usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString();
        lock (obj)
        {                
            lst.Add(usrgp);
        }
    });

Хотя это немного улучшило производительность, производительность все же не является оптимальной.Теперь весь цикл завершается менее чем за одну секунду.

...