C# 如何在执行下一行代码之前等待计时器完成,而不使线程进入睡眠状态?
我试图在我的应用程序中定时执行一些代码。我正在我的应用程序中创建多个线程,并试图让它们同时执行代码 我想知道是否有一种方法可以让我的线程等待计时器完成,然后继续执行下一段代码,而不让它进入睡眠状态?目前我正在这样做,但肯定还有另一种方法。有人能提供一些帮助吗C# 如何在执行下一行代码之前等待计时器完成,而不使线程进入睡眠状态?,c#,.net,C#,.net,我试图在我的应用程序中定时执行一些代码。我正在我的应用程序中创建多个线程,并试图让它们同时执行代码 我想知道是否有一种方法可以让我的线程等待计时器完成,然后继续执行下一段代码,而不让它进入睡眠状态?目前我正在这样做,但肯定还有另一种方法。有人能提供一些帮助吗 System.Timers.Timer _timer = new System.Timers.Timer(); _timer.Interval = (2000); _timer.Elapsed
System.Timers.Timer _timer = new System.Timers.Timer();
_timer.Interval = (2000);
_timer.Elapsed += (sender, e) =>
{
//code to execute
_timer.Enabled = false;
};
_timer.Enabled = true;
Thread.Sleep(2000);
//code to invoke my finished delegate
您可以使用以下方法实现更简洁的异步方法:
创建异步操作,主要是抽象线程模型。当您在一个标记为async的例程中时,wait关键字意味着等待它完成,然后运行。在上面的示例中,这一切都发生在执行线程之外。您可以使用更干净的异步方法:
创建异步操作,主要是抽象线程模型。当您在一个标记为async的例程中时,wait关键字意味着等待它完成,然后运行。在上面的示例中,这一切都发生在您的执行线程之外。您甚至不需要使用计时器,只需使用不会阻塞UI线程的功能即可
您甚至不需要使用计时器,只需使用不会阻塞UI线程的功能即可 我试图在我的应用程序中定时执行一些代码。我正在我的应用程序中创建多个线程,并试图让它们同时执行代码 一种基于多线程注释的方法是使用类 我试图在我的应用程序中定时执行一些代码。我正在我的应用程序中创建多个线程,并试图让它们同时执行代码 一种基于多线程注释的方法是使用类
假设你一定要这样做,你可以使用
如前所述,您最好使用另一个实现,如前面所述。假设您绝对必须这样做,您可以使用
如前所述,您最好使用另一个实现,如上述实现。这是Winforms,您担心UI线程吗?通常的做法是将@code放在单独的方法中调用我完成的委托@,然后在计时器委托中调用该方法。然后,如果需要从该方法调用另一段代码,请创建一个新的计时器,并将该块放入它自己的方法中。@ErikFunkenbusch,如果是UI线程,它可以返回运行消息泵,如果是线程池线程,它可以释放回池中以执行不同的任务。这两种情况是等待任务所允许的。延迟方法允许。@DanBryant-这两种情况都可能导致线程休眠。。。至少在另一个事件发生之前…这是Winforms,您是否担心UI线程,还是已经处理好了?通常的方法是将@code放置在单独的方法中,以调用我完成的委托@,并在计时器委托中调用该方法。然后,如果需要从该方法调用另一段代码,请创建一个新的计时器,并将该块放入它自己的方法中。@ErikFunkenbusch,如果是UI线程,它可以返回运行消息泵,如果是线程池线程,它可以释放回池中以执行不同的任务。这两种情况是等待任务所允许的。延迟方法允许。@DanBryant-这两种情况都可能导致线程休眠。。。至少在另一个事件发生之前……代码向您建议他们使用支持async/await的.NET版本如何?代码向您建议他们使用支持async/await的.NET版本如何?
Task.Run(async delegate
{
await Task.Delay(2000);
//do stuff here
});
private async void SomeMethod()
{
await Task.Delay(2000); // wait two seconds asynchronously
// your code goes here
// this code will be executed after two seconds
}
using (var mySignal = new CountDownEvent(doWorks.Count))
{
foreach (var doWork in doWorks)
{
// Start Threads example
Task.Factory.StartNew(() =>
{
// do work
// signal this thread done
mySignal.Signal();
}
}
// wait for all threads
mySignal.Wait();
// All threads are done.
}