我正在编写一个程序,其中有几个“工作”对象关闭并执行需要花费一定时间的任务。我创建了一个带有内部计时器的工作类,它正常工作。但是,在进行“工作”时,我有时需要等待几秒钟才能刷新屏幕(每个工作人员都在从远程屏幕抓取数据并进行自动化)。
对于那些暂停,我不想睡觉,因为我理解它也会 暂停其他工作对象的计时器(我的应用程序是单个线程,因为坦白说,我是C#的新手,我不想超越)。还有另一个我可以使用的等待函数,它实际上并没有挂起整个线程吗?
其他一些信息:
下面的代码(实际工作将使用“startWorking”方法完成,但没有实现 - 这只是我的销售版本,定时器工作。此外,主要用于现在测试多个计时器)< / p>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace Multi_Timers
{
//worker class that includes a timer
public class Worker
{
private Timer taskTimer;
private bool available = true;
private string workerName;
private string startWork;
private int workTime;
// properties
public bool isAvailable { get { return this.available; } }
public string name { get { return this.workerName; } }
// constructor
public Worker(string name)
{
this.workerName = name;
Console.WriteLine("{0} is initialized", name);
}
// start work timer
public void startWorking(int duration) {
if (this.available == true)
{
this.available = false;
this.taskTimer = new Timer();
this.taskTimer.Interval = duration;
this.taskTimer.Elapsed += new ElapsedEventHandler(doneWorking);
this.taskTimer.Enabled = true;
this.startWork = DateTime.Now.ToString();
this.workTime = duration / 1000;
}
else Console.WriteLine("Sorry, {0} was not available to work", this.workerName);
}
// Handler for timer
public void doneWorking(object sender, ElapsedEventArgs e)
{
Console.WriteLine("{0}: {1} / {2} min / {3}", this.workerName, this.startWork, this.workTime/60, e.SignalTime.ToLocalTime());
this.taskTimer.Enabled = false;
this.available = true;
}
}
//main program
class Program
{
static void Main(string[] args)
{
Random r = new Random();
// initialize worker(s)
Worker bob = new Worker("Bob");
Worker bill = new Worker("Bill");
Worker jim = new Worker("Jim");
// q to exit
while (true)
{
if (bob.isAvailable) {
bob.startWorking(r.Next(1 * 60, 150 * 60) * 1000);
}
if (bill.isAvailable)
{
bill.startWorking(r.Next(1 * 60, 150 * 60) * 1000);
}
if (jim.isAvailable)
{
jim.startWorking(r.Next(1 * 60, 150 * 60) * 1000);
}
}
}
}
}
提前感谢您的帮助!从这个社区中读取示例绝对是教我自己一点C#开始的关键!
答案 0 :(得分:2)
我不想睡觉线程,因为我理解它也会暂停其他工作对象上的计时器
这是不正确的;它不会阻止计时器。
我的申请是单线程
不,实际上,事实并非如此。计时器将创建并使用其他线程来实现其行为。将从线程池线程触发Elapsed
事件处理程序。
您的代码的一个主要问题是您的main
方法正在对三个对象执行“忙碌”,不断轮询它们询问它们是否已完成。这是......昂贵的。这基本上就像你小孩子们问的那样,“我们还在吗?”几秒钟几百次。如果他们只是坐着等待你告诉他们你已经完成了,那会不会更好! (这很可能,也是一个很好的选择。)
在这种情况下,一个更简单的解决方案是在worker中进行循环,而不是Main
。将startWorking
的实现包含在while
循环中,并让main只是永远等待(即Thread.Sleep(Timeout.Infinite);
)。更复杂的选项是让工作人员提供Task
,事件或阻塞等待(也称为“加入”)方法来指示它们何时完成。
您正在考虑的选项,即在Thread.Sleep
中添加Main
一段时间帮助,但它只会告诉您的孩子在您何时问您不常见,而不是让他们在你那里等你告诉他们。
答案 1 :(得分:0)
如果您发现自己想要在不同的上下文中再次延迟执行,可以考虑这样的实现:
private static void DelayExecution(Action action, TimeSpan delay)
{
TimeSpan start = DateTime.Now.TimeOfDay;
Thread t = new Thread(() =>
{
while (DateTime.Now.TimeOfDay < start.Add(delay))
{
//Block
}
action.Invoke();
});
t.Start();
}
private static void Main(string[] args)
{
DelayExecution(() => Console.WriteLine("Delayed Execution"), TimeSpan.FromSeconds(1));
Console.ReadLine();
}