我正在编写一个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毫秒执行一次。当然“那个东西”我不能在现有的循环中写它,因为该循环在5秒内执行5。我需要编写很多无限循环的代码,每个循环都是在不同时间独立于另一个(或异步)执行的。
我搜索了很多,我的结论是异步编写每个循环。 我的问题是:怎么做?我找到的每个代码对我来说都是完全不可理解的。我根本无法理解他们。所以,如果你有比async无限循环更好的选择(我认为它确实是最好的选择),你可以谈论它,否则我需要一些帮助编码这个异步无限循环......
抱歉我的英文不好, 提前谢谢
答案 0 :(得分:12)
var loop1Task = Task.Run(async () => {
while (true) {
await Task.Delay(5000);
}
});
var loop2Task = Task.Run(async () => {
while (true) {
await Task.Delay(100);
}
});
现在你有两个循环。您可以向他们添加代码。
答案 1 :(得分:2)
之后无限循环...
那不是“无限”的意思:)
您可以同时运行两个进程,只需将它们放在自己的线程中即可。这还有一个额外的好处,即您的应用程序主机不会被您的循环阻止,因此您可以自由地使用应用程序主机执行其他操作。 (并且它似乎没有被“冻结”到主机系统。)
这可能就像这个简单......
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的信息。
答案 2 :(得分:2)
您可以使用异步等待来完成此操作,如下所示:
创建一个异步调用方法,该方法将以非阻塞方式调用具有无限循环的多个方法。
SELECT NEXT VALUE FOR CountBy1 AS SequenceID
GO
创建具有无限循环的第一个方法异步,如下所示:
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
}
}
谢谢!!
答案 3 :(得分:1)
请按照以下步骤操作:
Task.Factory.StartNew(() => {methodname}());
Task.Factory.StartNew(() => {methodname}());
来呼叫他们。您需要使用System.Threading.Tasks
,这可能是您在创建项目时默认添加的,但如果没有,则需要添加它。