foreach异步睡眠方法
本文关键字:方法 异步 foreach | 更新日期: 2023-09-27 18:28:22
我正在尝试使foreach循环异步。循环第一次循环,做某事,然后等待40秒,然后循环再次循环,等待40秒等
在我的情况下,我会循环浏览推文,获取推文用户名,然后向他们发送推文。我尝试使用Thread.Sleep(40000)
方法,但这只是冻结了应用程序,我无法使用它,循环40秒都不会停止,然后再次循环。应用程序冻结了,但循环没有,推文甚至不用等待就可以发送。这就是我的代码看起来像的样子
private void tweetButton_Click(object sender, EventArgs e)
{
var tweets= .........
foreach (var tweet in tweets)
{
// Do Something
System.Threading.Thread.Sleep(40000);
}
如何让foreach循环暂停,然后再自行循环,以及如何在不冻结应用程序的情况下使其暂停?
https://msdn.microsoft.com/en-us/library/hh194873(v=vs.110).aspx
我想你可以await Task.Delay(40000);
——对我来说,这将是你所要求的"异步睡眠"。
或者,你可以启动计时器。计时器可能是一个更好的选择,但它将在线程池线程上运行。
编辑:不知道为什么会变成-1……但如果有人能解释的话,我会感兴趣的。
我已经验证了"等待任务.延迟(xyz)"确实可以用于此目的。当然,您需要添加async
关键字。
static async void DoSomething()
{
for(var i = 0;i<25;i++)
{
// Do Something
await Task.Delay(1000);
Console.WriteLine("Sending a Tweet");
}
}
我不能谈论性能,但它似乎对我来说很好。
您希望代码在不同的线程上运行,因此它不会阻碍代码在winformsgui线程中运行。满足你特定需求的最佳方式是一个计时器,你启动一次,然后就可以完成你的工作。
{
Timer t = new Timer();
t.Interval = 50000;
t.Elapsed += T_Elapsed;
t.Start();
}
private static void T_Elapsed(object sender, ElapsedEventArgs e)
{
}
如果您需要从这里访问winforms控件,可以使用invoke,这样命令就被放入gui线程消息循环中。
control.Invoke((MethodInvoker)(() =>
{
//Do your thing
}));
您可以在表单中实现后台流程。这将适用于您的情况。