【问题标题】:DispatcherTimer not working inside task any reason?DispatcherTimer 在任务内部没有任何原因?
【发布时间】:2014-08-13 13:59:55
【问题描述】:

好的,如下所示

public MainWindow()
{
    CheckCrawlURLs.func_StartCrawlingWaitingUrls();    
}

但是这在下面不起作用

public MainWindow()
{                 
    Task.Factory.StartNew(() =>
    {
        CheckCrawlURLs.func_StartCrawlingWaitingUrls();
    });
}

以下是两个示例中执行的类

public static class CheckCrawlURLs
{
    public static void func_StartCrawlingWaitingUrls()
    {
        PublicStaticFunctions.AddMsgToEvents("Checking waiting crawling urls process started");
        System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler(func_CheckWaitingUrls);
        dispatcherTimer.Interval = new TimeSpan(0, 0, 5);
        dispatcherTimer.Start();
    }

    private static void func_CheckWaitingUrls(object sender, EventArgs e)
    {
        PublicStaticFunctions.AddMsgToMoreCommonEvents("Checking waiting to crawl urls...");
        List<string> lstStartCrawling = CrawlURLDB.func_ReturnNextCrawlLinks();
        PublicStaticFunctions.AddMsgToMoreCommonEvents("Number of links to start crawlin: " + lstStartCrawling.Count);
    }
}

所以我的问题是这里的逻辑是什么?

在第二个任务工厂启动时,func_CheckWaitingUrls 没有运行。

我应该使用哪一个?

【问题讨论】:

  • 反之亦然,使用计时器启动任务。通常需要一些最小的联锁,因此当上一次调用尚未完成时,您不会再次启动任务。或者在 UI 消失时运行。

标签: c# wpf task-parallel-library task dispatchertimer


【解决方案1】:

顾名思义,DispatcherTimer 基于 WPF 调度程序。显然,这只适用于 GUI 线程。

改为查看System.Threading.Timer - 或仅在新线程上启动计时器回调。

【讨论】:

  • 回答,但更详细的答案会很棒
  • @MonsterMMORPG 更详细的答案将更多地取决于您具体要做什么。例如,看起来您根本不需要启动新线程 - 为什么不在异步 I/O 上使用 awaits,结合例如Task.Delay?看起来您正在使用数据库并执行 HTTP 请求,这两者都可以使用异步 I/O 轻松完成。
  • 我需要经期检查。所以我正在启动一个将进行周期检查的功能。我想将此功能作为一项新任务启动。
  • @MonsterMMORPG 对。在这种情况下,在 GUI 线程中创建并启动计时器,并在 Tick 事件处理程序中启动新任务。如果任务已经在运行,确保它不会开始可能会很有用。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多