在C#中以异步方式发送5000条消息

时间:2017-12-22 10:01:14

标签: c# async-await

我必须发送10000封邮件。目前,它同步发生,最多需要20分钟发送。

// sending messages in a sync way
foreach (var message in messages)
{
    var result = Send(message);
    _logger.Info($"Successfully sent {message.Title}.")
}

为了缩短消息发送时间,我想使用async和await,但我担心的是C#运行时是否可以在工作进程中处理15000个任务。

var tasks = new List<Task>();
foreach (var message in messages) 
{
    tasks.Add(Task.Run(() => Send(message))
}

var t = Task.WhenAll(tasks);
t.Wait();
...

此外,就记忆而言,我不确定创建15000个任务的列表是否是个好主意

1 个答案:

答案 0 :(得分:7)

自从我下班回家后,我已经玩了一下,这是我的答案。

首先Parallel.ForEach使用起来非常酷,并且我的8核心运行非常快。

我建议限制CPU使用率,这样你就不会使用100%的容量,但这取决于你的系统,我已经提出了两个建议。

其他事情是您需要监控并确保您的发件人服务器可以吃掉所有这些工作而不会遇到麻烦。

这是一个实现:

public void MessMessageSender(List<Message> messages)
{
    try
    {
        var parallelOptions = new ParallelOptions();
        _cancelToken = new CancellationTokenSource();
        parallelOptions.CancellationToken = _cancelToken.Token;
        var maxProc = System.Environment.ProcessorCount;
        // this option use around 75% core capacity
        parallelOptions.MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling(maxProc * 1.75));
        // the following option use all cores expect 1
        //parallelOptions.MaxDegreeOfParallelism = (maxProc * 2) - 1;
        try
        {
            Parallel.ForEach(messages, parallelOptions, message =>
            {
                try
                {
                    Send(message);
                    //_logger.Info($"Successfully sent {text.Title}.");
                }
                catch (Exception ex)
                {
                    //_logger.Error($"Something went wrong {ex}.");
                }
            });
        }
        catch (OperationCanceledException e)
        {
            //User has cancelled this request.
        }
    }
    finally
    {
        //What ever dispose of clients;
    }
}

我的答案受到启发page