首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Timer.Elapsed处理程序突然停止

Timer.Elapsed处理程序突然停止
EN

Stack Overflow用户
提问于 2018-02-09 21:05:54
回答 2查看 75关注 0票数 0
代码语言:javascript
复制
var checkTimer = new Timer();
checkTimer.Elapsed += (s, e) =>
{
    bool? doneIndexing = serviceConnection.GetIndexStatus();                    
    Log.Debug(TAG, $"Indexing status: {doneIndexing}");
    if (doneIndexing.HasValue && doneIndexing == true)
    {
        Log.Debug(TAG, "Done indexing, updating UI");
        var indexStatusView = FindViewById<TextView>(Resource.Id.indexStatusView);
        var indexProgress = FindViewById<ProgressBar>(Resource.Id.indexProgress);
        indexStatusView.Text = GetString(Resource.String.done_indexing);
        indexProgress.Visibility = ViewStates.Gone;
        checkTimer.Enabled = false;
    }
};
checkTimer.Interval = 100;
checkTimer.Enabled = true;

执行在indexStatusView.Text = GetString(Resource.String.done_indexing)停止。当doneIndexing == true时,它确实会被调用几次,但是即使我将禁用线移到顶部,执行仍然会在同一行停止。是什么导致的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-09 21:29:45

在indexStatusView.Text停止执行..。

在UI线程上执行UI更新,即:

代码语言:javascript
复制
if (doneIndexing.HasValue && doneIndexing == true)
{
    var indexStatusView = FindViewById<TextView>(Resource.Id.indexStatusView);
    var indexProgress = FindViewById<ProgressBar>(Resource.Id.indexProgress);
    Log.Debug(TAG, "Done indexing, updating UI");
    RunOnUiThread(() =>
    {
        indexStatusView.Text = GetString(Resource.String.done_indexing);
        indexProgress.Visibility = ViewStates.Gone;
    });
    checkTimer.Enabled = false;
}
票数 4
EN

Stack Overflow用户

发布于 2018-02-09 21:14:15

我只是查了一下这个计时器,我最好的猜测是,你有一个异常,被淹没了。显然,这个计时器使用的是重多线程。甚至可以在不同池线程上的parlell中运行多个经过的事件。

Unfortuantley多线程并不擅长吞咽异常。这个人似乎没有能力避免这种情况或暴露例外:https://developer.xamarin.com/api/event/System.Timers.Timer.Elapsed/

“如果Timer.SynchronizingObject属性为null,则在ThreadPool线程上引发Timer.Elapsed事件。如果Timer.Elapsed事件的处理持续时间超过Timer.Interval,则该事件可能会在另一个ThreadPool线程上再次引发。在这种情况下,事件处理程序应该是可重入的。”

“Timer组件捕获并抑制事件处理程序为Timer.Elapsed事件引发的所有异常。此行为可能在.NET框架的未来版本中发生更改。”

调试它的能力取决于您的技能,即从互斥线程中获取异常,并可能从一般多线程中获取异常。考虑到这项工作可能会持续很长时间,也许限制费率会更好?在另一个线程中运行这样的代码:

代码语言:javascript
复制
integer interval = 20;
DateTime dueTime = DateTime.Now.AddMillisconds(interval);

while(true){
  if(DateTime.Now >= dueTime){
    //insert code here

    //Update next dueTime
    dueTime = DateTime.Now.AddMillisconds(interval);
  }
  else{
    //Just yield to not tax out the CPU
    Thread.Sleep(1);
  }
}
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48714078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档