foreach异步睡眠方法

时间:2015-12-28 03:25:07

标签: c# winforms visual-studio

我试图使我的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循环在再次循环之前暂停,如何在不冻结应用程序的情况下暂停它?

3 个答案:

答案 0 :(得分:4)

https://msdn.microsoft.com/en-us/library/hh194873(v=vs.110).aspx

我认为你可以 <net.margaritov.preference.colorpicker.ColorPickerPreference android:key="pref_color" android:title="@string/pref_color_title" android:defaultValue="@color/picker_example" alphaSlider="true" hexValue="true" /> 对我来说就像你要求的那样是'异步睡眠'。

或者,您可以启动计时器。计时器可能是更好的选择,但将在线程池线程上运行。

编辑:不知道为什么这会得到-1 ......但是如果有人有解释,我会感兴趣。

我已经验证'等待Task.Delay(xyz)'确实可以用于此目的。当然,您需要添加await Task.Delay(40000);关键字。

async

我不能谈论表演,但似乎对我来说很好。

答案 1 :(得分:4)

您希望您的代码在不同的线程上运行,因此它会影响您在winforms gui线程中运行的代码。 满足您特定需求的最佳方式是启动一次,然后完成工作的计时器。

    {
        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
}));

答案 2 :(得分:0)

您可以在表单中实施background进程。这适用于你的情况。