c# подождите некоторое время без блокировки

Я хочу, чтобы мой метод подождал около 500 мс, а затем проверил, изменился ли какой-либо флаг. Как выполнить это, не блокируя остальную часть моего приложения?

7 ответов


нить.Sleep (500) заставит текущий поток ждать 500 мс. Он работает, но это не то, что вы хотите, если все ваше приложение работает в одном потоке.

в этом случае вы захотите использовать таймер, например:

using System.Timers;

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

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

вы также можете установить AutoReset в false (или не устанавливать его вообще), если вы хотите, чтобы таймер повторился.


Я действительно не понимаю вопрос.

Если вы хотите заблокировать перед проверкой, используйте Thread.Sleep(500);

Если вы хотите проверить асинхронно каждые X секунд, вы можете использовать Timer для выполнения обработчика каждые x миллисекунд.

это не заблокирует ваш текущий поток.


Это метод, о котором идет речь, выполняется в другом потоке, чем остальная часть вашего приложения, затем сделайте следующее:

Thread.Sleep(500);

можно использовать await Task.Delay(500); без блокировки потока, как Sleep делает, и с гораздо меньшим кодом, чем таймер.


System.Threading.Thread.Sleep(500);

обновление

Это не будет блокировать остальную часть вашего приложения, только поток, в котором выполняется ваш метод.


использование таймера должно сделать трюк

Если вам нужно использовать нить, то вот пример

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

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

Задача Asynchron:

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

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