在始终为true的while循环中使用Task.Delay暂停发送发布请求

时间:2017-08-23 22:21:25

标签: c# multithreading webforms task telegram-bot

我已经使用webforms写了一个电报机器人,一直都是真的while循环,一个线程总是发布到api.telegram.org/bottoken/getupdates到一个包含100个更新的get json格式数组。

我的机器人的主机配置不足以处理例如200个并发电报机器人请求。 所以我最终提出了一个改进并发用户数量的想法,并给予时间来执行他们需要的东西。请告诉我它是真还是完全错。

我在获取每次更新后在我的while循环中使用await Task.Delay(150),因此while线程将返回到线程池(??)并且程序有150多毫秒来处理例如100个请求然后去下一个更新阵列来自电报。

while (!cancellationToken.IsCancellationRequested) {
    await Get100UpdatesAndProcess();//database works, sending answers etc...
    await Task.Delay(150);
}

这项工作是否存在任何问题,即性能问题,内存泄漏,无用,线程浪费等,

感谢

1 个答案:

答案 0 :(得分:0)

你的方法似乎正确,我无法预见任何内存泄漏或其他什么。 一个小的改变可能是避免TPL的2同步:

while (!cancellationToken.IsCancellationRequested)
{
    await Get100UpdatesAndProcess().ContinueWith(t => Task.Delay(150));
}

但无论如何,现在长期运行的任务分两步处理:接收和处理。如果您有一个队列系统(MSMQ,Rabbit MQ),您可以以类似于生产者消费者的方式拆分任务。 您将看到您的应用程序具有容错能力,可分发性,并且通常更加分离。

您的代码如下所示:

while (!cancellationToken.IsCancellationRequested)
{
    var updates = await Get100Updates();
    foreach (var upt in updates)
    {
        Q.Enqueue(upt); // This is referring to the Queueing System, don't take it literally
    }
}

并在不同的线程或节点或应用程序中

while (!cancellationToken.IsCancellationRequested)
{
    var upt = Q.Dequeue() // Get pending update for processing
    await Process(upt);
}

使用此样式,您几乎可以使用所有可用的CPU时间,并且没有未使用的延迟。