异步无限循环

Mig*_*nny 2 c# loops asynchronous infinite

我正在编写一个C#软件,它有一些功能,可以在5秒内在我的服务器5上签到(他们发送http请求,但对我的问题无关紧要).这是代码:

    log();

    while (true)
    {

        alive(); // this sends an http request to my server
        Thread.Sleep(5000); // sleep for 5 seconds avoiding computer overcharge
    }

    MessageBox.Show("after infinite loop"); // this is never executed but i pretend to do so
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:我得到了一个无限循环,在那个无限循环之后我想写另一个无限循环,它以异步方式运行并且每100毫秒执行一次.当然"那个东西"我不能在现有的循环中写它,因为该循环在5秒内执行5.我需要编写很多像这样的无限循环,每个循环都是以不同的时间独立于另一个(或异步)执行的.

我搜索了很多,我的结论是异步编写每个循环.我的问题是:怎么做?我找到的每个代码对我来说都是完全不可理解的.我根本无法理解他们.所以,如果你有比async无限循环更好的选择(我认为这是最好的选择),你可以谈论它,否则我需要一些帮助编码这个异步无限循环...

抱歉我的英语不好,提前谢谢

usr*_*usr 15

var loop1Task = Task.Run(async () => {
 while (true) {
  await Task.Delay(5000);
 }
});

var loop2Task = Task.Run(async () => {
 while (true) {
  await Task.Delay(100);
 }
});
Run Code Online (Sandbox Code Playgroud)

现在你有两个循环.您可以向他们添加代码.

  • 如果您需要退出这些循环,您也可以使用取消令牌(并将它们传递给延迟调用以启动). (3认同)

Dav*_*vid 6

在那个无限循环之后......

这不是“无限”的真正含义:)

您可以有两个同时运行的进程,只需将它们放在自己的线程中即可。这还有一个额外的好处,即您的应用程序主机不会被您的循环阻塞,因此您可以自由地使用应用程序主机做其他事情。(而且它似乎没有被主机系统“冻结”。)

事情可能就这么简单……

public class Worker
{
    public void DoWork()
    {
        while (true)
        {
            alive(); // this sends an http request to my server
            Thread.Sleep(5000); // sleep for 5 seconds avoiding computer overcharge
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其作为线程启动:

var workerObject = new Worker();
var workerThread = new Thread(workerObject.DoWork);
workerThread.Start();
Run Code Online (Sandbox Code Playgroud)

您可以向线程发送各种信息和信号,为它们提供来自使用代码的数据并在它们运行时控制它们。(因为您当然不希望无法与之交互的失控线程。)所以这只是一个非常简单的示例,可以帮助您入门并说明概念。

您可以在 MSDN以及许多其他地方找到更多关于和更完整示例的信息。