Оптимизируйте этот код для Parallel.ForEach или любым другим способом на C # - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть кусок кода.Как конвертировать это в Parallel.ForEach?Я пытался использовать многопоточность для оптимизации кода.Может ли кто-нибудь помочь мне получить результат?

  List<BOUserShoutoutResponseData> result = conList.Select(con =>
            {
                List<string> totalShoutoutImages = new List<string>();
                totalShoutoutImages = ShoutoutMultipleImages(con.ShoutoutId, con.UserId, con.ShoutoutImageName, con.IsImageSync, shoutoutImages);
                return new BOUserShoutoutResponseData()
                {
                    UserName = (con.FirstName ?? string.Empty) + " " + (con.LastName ?? string.Empty),
                    UserId = (Guid)con.UserId,
                    Distacne =
                        Convert.ToDecimal(
                            Math.Round(
                                ConvertDistance.DistanceTo(Convert.ToDouble(request.UserLatitude),
                                    Convert.ToDouble(request.UserLongitude), Convert.ToDouble(con.UserLatitude),
                                    Convert.ToDouble(con.UserLongitude), request.DistanceType[0]), 12)),
                    DistacneTemp = Convert.ToDecimal(con.Distance),
                    ShoutoutLatitude = Convert.ToString(con.ShoutoutLatitude),
                    ShoutoutLongitude = Convert.ToString(con.ShoutoutLongitude),
                    ShoutoutTypeId = con.ShoutoutTypeId ?? 0,
                    ShoutoutType = con.ShoutoutType ?? string.Empty,
                    PostTypeId = con.PostTypeId ?? 0,
                    PostType = con.PostTypeName ?? string.Empty,
                    Description = con.Description ?? string.Empty,
                    TotalLike = (int)con.TotalLike,
                    Url = con.Url ?? string.Empty,
                    PlaceId = con.PlaceId ?? string.Empty,
                    AddressComponents = 
                    GetAddressComponentOfShoutout((long)con.ShoutoutId),
                    UserSmallImagePath =
                        string.IsNullOrEmpty(con.ImageName)
                            ? string.Empty
                            : GetUserImagePath(con.ImageName + "--S", 
    (bool)con.IsProfileImageSync),
GetShoutoutImagePath(con.UserId.ToString(), con.ShoutoutImageName + "--M", 
(bool)con.IsImageSync),
                    ShoutoutImages = totalShoutoutImages ?? null                        
        return result;

1 Ответ

2 голосов
/ 20 сентября 2019

Почему бы не добавить AsParallel() и не превратить Linq в Parallel Linq ?

List<BOUserShoutoutResponseData> result = conList
  .AsParallel() // Same Linq but doing in parallel
//.AsOrdered()  // uncomment if you want to preserve items' order
  .Select(//TODO: check totalShoutoutImages usage
          con => new BOUserShoutoutResponseData() { 
            UserName     = string.Join(" ", con.FirstName, con.LastName),
            PostTypeId   = con.PostTypeId ?? 0,
            PostType     = con.PostTypeName ?? string.Empty,
            Description  = con.Description ?? string.Empty,
            TotalLike    = (int)con.TotalLike,
            TotalComment = (int)con.TotalComment
            ... 
          })
  .ToList();

return result;

Тогда вы можете настроить запрос с помощью WithDegreeOfParallelism(...),WithMergeOptions(...) и т. Д. Варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...