【问题标题】:c# new Thread(() to Application.Current.Dispatcher taking long timec# new Thread(() to Application.Current.Dispatcher 需要很长时间
【发布时间】:2018-07-05 13:15:07
【问题描述】:

我在主线程中创建了新线程

     new Thread(() =>
                    {
                       // my code
                       System.Diagnostics.Debug.WriteLine("my code completed");
                       Application.Current.Dispatcher.Invoke(MyMethod, DispatcherPriority.ContextIdle);
                    }).Start();

执行my code后,调用MyMethod需要5-8秒

我在输出窗口中看到,在调用MyMethod之前,下面的行出现了几次

The thread 0x2954 has exited with code 259 (0x103)

为了解决这个问题,我厌倦了使用Thread.CurrentThread.Abort(); 中止当前线程,但这并没有解决我的问题。我想在my code 完成后立即致电MyMethod

【问题讨论】:

  • 不使用线程,为什么不使用任务,然后您可以使用 Task.ContinueWith 调用 MyMethod。见msdn.microsoft.com/en-us/library/dd270696(v=vs.110).aspx
  • 使用 Debug > Windows > Threads 找出主线程如此繁忙的原因,小心它烧毁 100% 核心。使用 Invoke 而不是 BeginInvoke 是一个标准的 WPF 错误。 259 退出代码是由 VS2015 中的一个错误引起的,在其他方面没有任何意义。

标签: c# .net wpf multithreading visual-studio


【解决方案1】:

当您创建线程时,会在您的代码实际运行之前进行大量处理。如果您需要您的代码更具响应性,请查看线程池(Task 基本相同)。

请记住,即使使用线程池也可能需要一些时间才能启动,但应该比启动全新线程要少得多。

使用您的代码,您正在做的是启动一个线程(这可能需要很长时间),然后要求您的线程将控制权传递回 UI 线程,该线程本身可能正忙于做其他事情而无法运行你的代码直到它是免费的。

【讨论】:

  • 另外请记住,即使有一个线程池,池中的所有线程都可能很忙,因此将您的新线程暂停,直到有一个线程空闲。
  • “任务基本相同”。不,Task 不涉及Thread
  • @CamiloTerevinto 任务最终在线程上运行,但对于像 Vijay 这样的初学者来说,差异是微妙的。对于像您这样的专家来说,这种差异可能是巨大的。
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2020-08-26
  • 2014-10-09
  • 2012-11-26
  • 2019-12-27
  • 2017-10-22
  • 2020-11-15
  • 2016-05-19
相关资源
最近更新 更多