我正在使用C#进行语音识别程序,我编写了几行代码,当我说“电池电量”时会回复当前的电池电量。
if (e.Result.Text.ToLower() == "battery level")
{
System.Management.ManagementClass wmi = new System.Management.ManagementClass("Win32_Battery");
var allBatteries = wmi.GetInstances();
//String estimatedChargeRemaining = String.Empty;
int batteryLevel = 0;
foreach (var battery in allBatteries)
{
batteryLevel = Convert.ToInt32(battery["EstimatedChargeRemaining"]);
}
if(batteryLevel < 25)
JARVIS.Speak("Warning, Battery level has dropped below 25%");
else //Guessing you want else
JARVIS.Speak("The battery level is at: " + batteryLevel.ToString() + "%");
return;
}
只有当我说“电池电量”时才会发生这种情况,我希望它每隔15分钟自动检查一次电池电量,如果电池电量低于25%,则会自动通过语音向我报告:
if(batteryLevel < 25)
JARVIS.Speak("Warning, Battery level has dropped below 25%");
我猜我需要一个计时器,但除此之外我不知道。
感谢。
答案 0 :(得分:1)
一个选项是System.Threading.Timer。相关部分是回调和间隔。
该页面提供了更多信息,但这决定了这是否是您的正确选择。一些亮点是:
System.Threading.Timer是一个简单,轻量级的计时器,它使用回调方法并由线程池线程提供服务。不建议将其与Windows窗体一起使用,因为它的回调不会发生在用户界面线程上。 System.Windows.Forms.Timer是与Windows窗体一起使用的更好选择。对于基于服务器的计时器功能,您可以考虑使用System.Timers.Timer,它会引发事件并具有其他功能。
和
只要您使用Timer,就必须保留对它的引用。与任何托管对象一样,当没有对它的引用时,Timer会进行垃圾回收。定时器仍处于活动状态这一事实并不能阻止它被收集。
编辑:现在你已经说过你在WinForms中,你可以看到MSDN推荐System.Windows.Forms.Timer。该MSDN页面给出了一个例子。您会看到订阅Tick
事件是您的回调,Interval
是时间间隔(以毫秒为单位)。您想将其设置为您声明的15分钟,即1000 * 60 * 15或900000。
改编自MSDN示例:
private static readonly Timer batteryCheckTimer = new Timer();
// This is the method to run when the timer is raised.
private static void CheckBattery(Object sender, EventArgs myEventArgs)
{
ManagementClass wmi = new ManagementClass("Win32_Battery");
var allBatteries = wmi.GetInstances();
foreach (var battery in allBatteries)
{
int batteryLevel = Convert.ToInt32(battery["EstimatedChargeRemaining"]);
if (batteryLevel < 25)
{
JARVIS.Speak("Warning, Battery level has dropped below 25%");
}
}
}
[STAThread]
public static void Main()
{
// Start the application.
Application.Run(new Form1());
batteryCheckTimer.Tick += new EventHandler(CheckBattery);
batteryCheckTimer.Interval = 900000;
batteryCheckTimer.Start();
}
答案 1 :(得分:1)
每15分钟一次循环调用将导致MainUI线程响应不佳,应用程序将崩溃。您可以使用线程来解决此问题。请查看以下代码片段,它将帮助您满足您的需求。您可以通过引用 System.Windows.Forms 命名空间而不是WMI查询来使用 SystemInformation 类。将Timer控制间隔设置为900000,每15分钟执行一次操作。如果有用,请标记答案
public delegate void DoAsync();
public void Main()
{
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 900000;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
DoAsync async = new DoAsync(GetBatteryDetails);
async.BeginInvoke(null, null);
}
public void GetBatteryDetails()
{
int i = 0;
PowerStatus ps = SystemInformation.PowerStatus;
if (ps.BatteryLifePercent <= 25)
{
if (this.InvokeRequired)
this.Invoke(new Action(() => JARVIS.Speak("Warning, Battery level has dropped below 25%");
else
JARVIS.Speak("Warning, Battery level has dropped below 25%");
}
i++;
}
答案 2 :(得分:0)
正如McAden所说,可以使用计时器。可以在msdn website上找到计时器的示例。