不能保证在10ms内结束,但是也不重新启动定时器,阻塞等待任务结束呢
时间: 2024-03-16 15:47:28 浏览: 8
好的,那么按照你的需求,我们可以修改代码,实现在任务结束之前阻塞等待,直到任务完成后再重新启动定时器。具体实现方式如下:
```csharp
using System.Threading;
private static Timer timer;
private static bool isRunning;
public static void Main(string[] args)
{
isRunning = false;
timer = new Timer(TimerCallback, null, 0, 10);
// 等待程序执行
Console.ReadLine();
}
private static void TimerCallback(Object o)
{
// 如果任务正在执行,则直接返回
if (isRunning)
{
return;
}
// 否则,启动新的任务
isRunning = true;
Task.Run(() =>
{
// 在这里执行你想要执行的子线程任务
Thread.Sleep(100); // 模拟任务执行需要100毫秒的时间
isRunning = false;
}).ContinueWith(task =>
{
// 任务执行完成后重新启动定时器
timer.Change(10, Timeout.Infinite);
});
}
```
其中,我们添加了一个isRunning变量,用于表示当前任务是否正在执行。在定时器回调函数中,首先判断是否有任务正在执行,如果有,则直接返回,否则启动新的任务执行。
在任务执行完毕后,我们使用ContinueWith()方法来继续执行后续操作,即重新启动定时器。需要注意的是,在重新启动定时器之前,需要将isRunning变量设置为false,表示当前任务已经执行完成。
这样,就可以实现在任务结束之前阻塞等待的功能了。当然,如果任务执行的时间过长,可能会导致定时器的精度下降,需要根据实际情况进行调整。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)