我正在编写一个程序,该程序有几个“工人”对象启动并执行需要设定时间的任务。我创建了一个带有工作正常的内部计时器的工人类。然而,在做“工作”时,我有时需要等待几秒钟来刷新屏幕(每个工作人员都在从远程屏幕上抓取数据并进行一些自动化操作)。
对于那些暂停,我不想让线程休眠,因为据我了解,这也会暂停其他工作对象上的计时器(我的应用程序是单线程,因为坦率地说,我是 C# 的新手,而且我不想超越)。是否有另一个我可以使用的等待功能实际上不会挂起整个线程?
一些附加信息:
- 现在这是一个控制台应用程序,但我最终将构建一个 UI 表单,向用户提供有关工人工作情况的反馈
- 我的计时器是使用 System.Timers 实现的,并且工作得很好
- 我是 C# 编程的新手,这是我的第一个项目,所以请用小词;)
- 使用 MS VS Express 2012 for Desktop(所以无论是什么版本的 C#/.NET!)
下面的代码(实际工作将使用“startWorking”方法完成,但没有实现任何东西 - 这只是我出售的带有计时器的构建。此外,主要现在只是用于测试多个计时器)
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# 入门的关键!