等待一段时间而不阻塞主线程

时间:2011-12-13 21:16:44

标签: c# multithreading wait

我希望我的方法等待大约500毫秒,然后检查是否有一些标志已经改变。如何完成此操作而不会阻止我的其他应用程序?

9 个答案:

答案 0 :(得分:29)

Thread.Sleep(500)将强制当前线程等待500ms。它可以工作,但如果你的整个应用程序在一个线程上运行,那就不是你想要的了。

在这种情况下,您需要使用Timer,如下所示:

using System.Timers;

void Main()
{
    Timer t = new Timer();
    t.Interval = 500; // In milliseconds
    t.AutoReset = false; // Stops it from repeating
    t.Elapsed += new ElapsedEventHandler(TimerElapsed);
    t.Start();
}

void TimerElapsed(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Hello, world!");
}

如果您希望计时器重复,可以将AutoReset设置为true(或根本不设置)。

答案 1 :(得分:9)

您可以await Task.Delay(500);使用Sleep而不会像{{1}}那样阻止线程,并且使用的代码少于计时器。

答案 2 :(得分:7)

我真的不明白这个问题。

如果您想在检查前阻止,请使用Thread.Sleep(500);

如果要每x秒异步检查一次,可以使用Timer每隔x毫秒执行一次处理程序。

这不会阻止您当前的线程。

答案 3 :(得分:5)

有问题的方法是在与应用程序其余部分不同的线程上执行,然后执行以下操作:

Thread.Sleep(500);

答案 4 :(得分:2)

System.Threading.Thread.Sleep(500);

<强>更新

这不会阻止你的应用程序的其余部分,只是运行你的方法的线程。

答案 5 :(得分:0)

使用计时器应该可以做到这一点

如果你需要使用一个线程,那么这里是一个例子

void Main()
{
    System.Threading.Thread check= new System.Threading.Thread(CheckMethod);
    check.Start();
}

private void CheckMethod()
{
     //Code
     Thread.Sleep(500);
}

答案 6 :(得分:0)

Asynchron任务:

 var task = new Task (() => function_test()); task.Start();

public void function_test() { `Wait for 5000 miliseconds`   Task.Delay(5000);` }

答案 7 :(得分:0)

我最近一直在同一个问题上挣扎,我需要在不阻塞用户界面的情况下按计划运行某项操作。

这是我的解决方法:

private void Button_Click(object sender, RoutedEventArgs e)
{
    RunOnSchedule(interval, cancellationToken);
}

private void RunOnSchedule(int interval, CancellationToken cancellationToken)
{
    // Start the task you want to run on schedule
    TaskToRunOnSchedule(args);
    Task.Run(async () => 
    {
        // This loop checks if the task was requested to be cancelled every 1000 ms
        for (int x = 0; x < interval; x+=1000)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                break;
            }

            await Task.Delay(1000);
        }
    }).GetAwaiter().OnCompleted(() =>
    {
        // Once the task for delaying is completed, check once more if cancellation is requested, as you will reach this point regardless of if it was cancelled or not.
        if (!cancellationToken.IsCancellationRequested)
        {
            // Run this method again
            RunOnSchedule(interval, cancellationToken);
        }
    });
}

答案 8 :(得分:-2)

在WinForms应用程序中,当我想在主线程上等待而不阻塞应用程序时,我通常使用

private void Wait (double milliseconds)
{
    DateTime next = System.DateTime.Now.AddMilliseconds(milliseconds);
    while (next > System.DateTime.Now)
        Application.DoEvents();
}