异步无限循环
Async Infinite Loop
我正在编写一个 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
所以,我的问题是:我遇到了一个无限循环,在那个无限循环之后我想编写另一个异步运行并每 100 毫秒执行一次操作的无限循环。当然 "that something" 我不能将它写在现有循环中,因为该循环在 5 秒内执行了 5 次。我必须编写很多这样的无限循环,每个循环都在不同的时间独立于另一个(或异步)执行。
我搜索了很多,我的结论是异步编写每个循环。
我的问题是:该怎么做?我发现的每一个代码对我来说都是完全不可理解的。我简直无法理解他们。所以,如果你有比异步无限循环更好的选择(我认为这确实是最好的选择),你可以谈谈它,否则我需要一些帮助来编写这个异步无限循环...
抱歉我的英语不好,
提前致谢
按照以下步骤操作:
- 将你的循环放在它们自己的方法中
- 使用
Task.Factory.StartNew(() => {methodname}());
- 使用
Task.Factory.StartNew(() => {methodname}());
呼叫他们。
你需要为此使用System.Threading.Tasks
,它可能已经在你创建项目时默认添加,但如果没有,你需要添加它。
and after that infinite loop...
"infinite" 不是这个意思:)
您可以同时拥有两个 运行 进程,只需将它们放在各自的线程中即可。这还有一个额外的好处,即您的应用程序主机不会被您的循环阻塞,因此您可以自由地使用应用程序主机做其他事情。 (而且它似乎不是 "frozen" 到主机系统。)
它可以像这样简单...
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
}
}
}
然后将其作为线程启动:
var workerObject = new Worker();
var workerThread = new Thread(workerObject.DoWork);
workerThread.Start();
您可以向线程发送各种信息和信号,以向它们提供来自使用代码的数据并在它们处于 运行 时控制它们。 (因为您当然不希望无法与之交互的失控线程。)所以这只是一个非常的简单示例,可以帮助您入门并说明概念。
您可以在许多其他地方找到更多关于 on MSDN 的信息和更完整的示例。
var loop1Task = Task.Run(async () => {
while (true) {
await Task.Delay(5000);
}
});
var loop2Task = Task.Run(async () => {
while (true) {
await Task.Delay(100);
}
});
现在你有两个循环。您可以向它们添加代码。
您可以使用 async await 来完成,如下所示:
创建一个异步调用方法,它将以非阻塞方式调用具有无限循环的多个方法。
private async void Method1()
{
DoSomeInfiniteWork1(); //Don't use await here
MessageBox.Show("after First infinite loop"); //now it will executed instantly after calling DoSomeInfiniteWork1 method having infinite while loop.
DoSomeInfiniteWork2();
...some other task
}
创建具有无限循环的第一个异步方法如下:
static bool cancelwork1=false;
private async Task DoSomeInfiniteWork1()
{
log();
while (true)
{
//break logic to exit the loop if required
if(cancelwork1)
break;
alive(); // this sends an http request to my server
Task.Delay(5000); // Replace Thread.Sleep with Task.Delay
}
}
创建具有另一个无限循环的第二个方法:
static bool cancelwork2=false;
private async Task DoSomeInfiniteWork2()
{
while (true)
{
//break logic to exit the loop if required
if(cancelwork2)
break;
DoSomeOtherWork();// Do your other work
Task.Delay(5000); // Replace Thread.Sleep with Task.Delay
}
}
谢谢!!
我正在编写一个 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
所以,我的问题是:我遇到了一个无限循环,在那个无限循环之后我想编写另一个异步运行并每 100 毫秒执行一次操作的无限循环。当然 "that something" 我不能将它写在现有循环中,因为该循环在 5 秒内执行了 5 次。我必须编写很多这样的无限循环,每个循环都在不同的时间独立于另一个(或异步)执行。
我搜索了很多,我的结论是异步编写每个循环。 我的问题是:该怎么做?我发现的每一个代码对我来说都是完全不可理解的。我简直无法理解他们。所以,如果你有比异步无限循环更好的选择(我认为这确实是最好的选择),你可以谈谈它,否则我需要一些帮助来编写这个异步无限循环...
抱歉我的英语不好, 提前致谢
按照以下步骤操作:
- 将你的循环放在它们自己的方法中
- 使用
Task.Factory.StartNew(() => {methodname}());
- 使用
Task.Factory.StartNew(() => {methodname}());
呼叫他们。
你需要为此使用System.Threading.Tasks
,它可能已经在你创建项目时默认添加,但如果没有,你需要添加它。
and after that infinite loop...
"infinite" 不是这个意思:)
您可以同时拥有两个 运行 进程,只需将它们放在各自的线程中即可。这还有一个额外的好处,即您的应用程序主机不会被您的循环阻塞,因此您可以自由地使用应用程序主机做其他事情。 (而且它似乎不是 "frozen" 到主机系统。)
它可以像这样简单...
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
}
}
}
然后将其作为线程启动:
var workerObject = new Worker();
var workerThread = new Thread(workerObject.DoWork);
workerThread.Start();
您可以向线程发送各种信息和信号,以向它们提供来自使用代码的数据并在它们处于 运行 时控制它们。 (因为您当然不希望无法与之交互的失控线程。)所以这只是一个非常的简单示例,可以帮助您入门并说明概念。
您可以在许多其他地方找到更多关于 on MSDN 的信息和更完整的示例。
var loop1Task = Task.Run(async () => {
while (true) {
await Task.Delay(5000);
}
});
var loop2Task = Task.Run(async () => {
while (true) {
await Task.Delay(100);
}
});
现在你有两个循环。您可以向它们添加代码。
您可以使用 async await 来完成,如下所示:
创建一个异步调用方法,它将以非阻塞方式调用具有无限循环的多个方法。
private async void Method1()
{
DoSomeInfiniteWork1(); //Don't use await here
MessageBox.Show("after First infinite loop"); //now it will executed instantly after calling DoSomeInfiniteWork1 method having infinite while loop.
DoSomeInfiniteWork2();
...some other task
}
创建具有无限循环的第一个异步方法如下:
static bool cancelwork1=false;
private async Task DoSomeInfiniteWork1()
{
log();
while (true)
{
//break logic to exit the loop if required
if(cancelwork1)
break;
alive(); // this sends an http request to my server
Task.Delay(5000); // Replace Thread.Sleep with Task.Delay
}
}
创建具有另一个无限循环的第二个方法:
static bool cancelwork2=false;
private async Task DoSomeInfiniteWork2()
{
while (true)
{
//break logic to exit the loop if required
if(cancelwork2)
break;
DoSomeOtherWork();// Do your other work
Task.Delay(5000); // Replace Thread.Sleep with Task.Delay
}
}
谢谢!!