我正在編寫一個程序,有幾個「工人」對象關閉,並執行任務設置的時間量。我創建了一個工作正常的內部計時器。但是,在做「工作」時,我有時需要等待幾秒鐘才能刷新屏幕(每個工作人員正在從遠程屏幕上抓取數據並進行一些自動操作)。暫停程序不中斷定時器c#
對於那些暫停,我不想睡覺的線程,因爲據我所知,這也將 暫停在其他工人對象的計時器(我的應用程序是一個單一的線程,因爲,坦率地說,我是品牌新的C#和我不想超越)。是否還有另一個等待函數可以使用,它並不實際掛起整個線程?
一些額外的信息:
- 現在這是一個控制檯應用程序,但我最終將構建UI的形式來提供反饋給用戶如何工人正在做
- 我定時器實現使用System.Timers和正在工作很好
- 我是C#編程新品,這是我的第一個項目,所以請用小字;)
- 使用MS VS Express 2012的桌面(所以無論版本的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#開始的關鍵!
謝謝,我不知道他們的自動產生的線程爲自己,這是偉大的!對於主要的東西,我也欣賞幾種不同方法的建議。現在,它真的只是測試我的方法,肯定會在未來做一些更優雅的事情! – Adrian