首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让异步程序保持运行?

如何让异步程序保持运行?
EN

Stack Overflow用户
提问于 2015-05-13 03:53:59
回答 2查看 1.8K关注 0票数 1

我正在开发一个程序,它使用gmail imap来保持与S22的空闲连接,并实时接收消息。

我从我的Main方法中调用以下函数:

代码语言:javascript
复制
static void RunIdle()
{
    using (ImapClient Client = new ImapClient("imap.gmail.com", 993, "user", "pass", AuthMethod.Login, true))
    {

        if (!Client.Supports("IDLE"))
            throw new Exception("This server does not support IMAP IDLE");

        Client.DefaultMailbox = "label";
        Client.NewMessage += new EventHandler<IdleMessageEventArgs>(OnNewMessage);
        Console.WriteLine("Connected to gmail");

        while (true)
        {
            //keep the program running until terminated
        }

    }
}

使用无限的while循环是可行的,但似乎有一种更正确的方法。将来,如果我想添加更多的空闲连接,我看到我的解决方案工作的唯一方式是为每个连接使用单独的线程。

用while循环来完成我正在做的事情的最佳方式是什么?

EN

回答 2

Stack Overflow用户

发布于 2015-05-13 04:06:20

不要在静态变量中释放客户端并将其作为根。那样的话,它就会一直运行,并不断引发事件。根本不需要有一个等待循环。删除using语句。

如果这是程序中的最后一个线程,那么您确实需要让它保持活动状态。

代码语言:javascript
复制
Thread.Sleep(Timeout.Infinite);
票数 4
EN

Stack Overflow用户

发布于 2015-05-13 04:00:41

避免线程阻塞的简单解决方案是随机使用Task.Delay()一段时间。

代码语言:javascript
复制
static async Task RunIdle(CancellationToken token = default(CancellationToken))
{
    using (ImapClient Client = new ImapClient("imap.gmail.com", 993, "user", "pass", AuthMethod.Login, true))
    {

        ...

        var interval = TimeSpan.FromHours(1);
        while (!token.IsCancellationRequested)
        {
            await Task.Delay(interval, token);
        }
    }
}

您也许可以使用CancellationToken来代替while(true),以防在某个时刻需要停止执行。Task.Delay()也支持这一点。

不过,这些都是控制台应用程序的解决方案。如果作为服务运行,服务宿主将确保您的程序在启动后继续执行,因此您可以直接返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30200244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档