Проблема производительности с c# ToList () - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть этот блок кода. Мои данные около 20000 токенов. И я посылаю им 1000 и 1000. У меня тут проблемы с производительностью. Что я могу сделать здесь, чтобы заставить его работать лучше? Должен ли я попробовать сократить использование .ToList ()

var badgewiseGroup = tokensWithoutOnbehlfOf.GroupBy(x => x.BadgeCount);
foreach (var bGroup in badgewiseGroup)
{
    var badgeTokensWithoutOnbehlfOf = bGroup.Select(x => x).ToList();
    while (badgeTokensWithoutOnbehlfOf.Any())
    {
        var tokens = badgeTokensWithoutOnbehlfOf.Take(numberToTake).ToList();

        Log.Log(EventSeverity.Informational, $"Processing Push notification for MessageId:{pushContent.MessageId}, Username:{tokens.FirstOrDefault().Username}," +
            $" OnBehalfOf:{tokens.FirstOrDefault().OnBehalfOf}, Id:{tokens.FirstOrDefault().Id}, DeviceId:{tokens.FirstOrDefault().DeviceId}, " +
            $"Token:{tokens.FirstOrDefault().Token}, ");

        pushContent.Title = msgTitle;
        pushContent.Body = msgBody;
        var message = new Messaging.Message();

        var androidToken = tokens.Where(x => x.OsVersion != null && x.OsVersion.ToLower().Contains("android")).ToList();

        if (androidToken != null && androidToken.Any())
        {
            message = GetAndroidMessageNotifictationObject(androidToken, pushContent);
            SendMessage(message, pushContent.MessageId);
        }

        var iosToken = tokens.Where(x => x.OsVersion != null && x.OsVersion.ToLower().Contains("ios")).ToList();
        if (iosToken != null && iosToken.Any())
        {
            message = GetIOSMessageNotifictationObject(iosToken, pushContent);
            SendMessage(message, pushContent.MessageId);
        }

        var oldTokens = tokens.Where(x => string.IsNullOrEmpty(x.OsVersion)).ToList();
        if (oldTokens != null && oldTokens.Any())
        {
            message = GetOldAppUsersMessageNotifictationObject(oldTokens, pushContent);
            SendMessage(message, pushContent.MessageId);
        }


        badgeTokensWithoutOnbehlfOf = badgeTokensWithoutOnbehlfOf.Skip(numberToTake).ToList();
    }
}

1 Ответ

0 голосов
/ 07 апреля 2020

Если порядок выполнения не важен и вы используете .Net Core вы можете попробовать использовать для этого блок действия.

var blockOptions = new ExecutionDataflowBlockOptions()
{
    MaxDegreeOfParallelism = 48,
    SingleProducerConstrained = true,
    EnsureOrdered = true
};

ActionBlock<TypeInList> block = null;
block = new ActionBlock<TypeInList>(bGroup => 
{
    //your bGroup code
}, blockOptions);

tokensWithoutOnbehlfOf.ForEach(bGroup => block.Post(bGroup));

Более подробную информацию о ActionBlock вы можете найти здесь: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.dataflow.actionblock-1?view=netcore-1.0

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