C# 在移动设备上对后台工作人员进行线程睡眠(周期)是否效率低下?
我已经创建了一个在手机上运行的服务。C# 在移动设备上对后台工作人员进行线程睡眠(周期)是否效率低下?,c#,android,xamarin.android,xamarin,C#,Android,Xamarin.android,Xamarin,我已经创建了一个在手机上运行的服务。OnCreate()方法基本如下: public override void OnCreate() { var worker = new BackgroundWorker(); worker.DoWork += (s, e) => { while (true) { // do a web request & then destroy object
OnCreate()
方法基本如下:
public override void OnCreate()
{
var worker = new BackgroundWorker();
worker.DoWork += (s, e) =>
{
while (true)
{
// do a web request & then destroy object
Thread.Sleep(new TimeSpan(1, 0, 0)); // 1 hour
}
};
worker.RunWorkerAsync();
}
正如你所看到的,它做了一些事情,然后睡了一个小时
当线程处于睡眠状态时,是过度使用设备的电源,还是仅当线程正在运行时才使用?睡线效率低吗
更新
这是我根据建议所做的:
_displayTimer = new Timer();
_displayTimer.Interval = 3600000;
_displayTimer.Elapsed += (s, e) => { // do the stuff I need };
_displayTimer.Start();
你可以这样做:
final Handler handler = new Handler();
Timer timer = new Timer(false);
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
// your processing here
}
});
} };
timer.schedule(timerTask, 60 *60 * 1000);
或对于连续滴答声:
timer.scheduleAtFixedRate(timerTask, 1000, 60 *60 * 1000);
理论上,任务在睡眠时不应该消耗任何资源。但是,您可以通过这样编写来阻止运行时进行任何优化 使用async,您可以很好地将其编写为
public void OnCreate()
{
Worker ();
}
async void Worker ()
{
while (true) {
await Task.Delay (new TimeSpan (1, 0, 0)).ConfigureAwait (false);
Console.WriteLine ("Do stuff!");
}
}
或者,如果您的工作发生在UI线程上,请删除
ConfigureAwait(false)
为什么不使用计时器每小时运行一次线程?也许我应该!在这一点上,这会更高效还是更低效?@DaveDev这会更高效,因为您不会浪费系统资源创建一个几乎所有时间都不做任何事情的线程。