【问题标题】:Does BeginInvoke() run a separate thread? [duplicate]BeginInvoke() 是否运行单独的线程? [复制]
【发布时间】:2011-04-07 08:06:48
【问题描述】:

在我的 WPF 应用程序中,我想在非 UI 线程中做一些工作,以避免 UI 变得无响应。为此,我这样做了:

var caller = new AsyncMethodCaller<Pattern>(this.SetPatternType);
caller.BeginInvoke(_patterns, null, null);

委托被定义为,

public delegate void AsyncMethodCaller<in T>(IEnumerable<T> data);

我的问题是:

BeginInvoke() 是否创建一个新线程并且回调SetPatternType 在其中运行?如果有,这个话题会持续多久?

这种方法总体上好吗?如果不是,它有什么问题?我可能会面临哪些潜在问题?

我正在使用 C# 4.0 和 Visual Studio 2010。


编辑:

我还需要一些关于这些的指导:

什么时候我应该自己创建一个新线程,什么时候应该使用BeginInvoke()?我什么时候应该使用DispatcherObject.Dispatcher.BeginInvoke() 对象?

【问题讨论】:

  • 你使用什么 .NET 版本?
  • @PVitt :我认为...我使用 .NET 4.0 就像我使用 Visual Studio 2010 一样。

标签: c# wpf multithreading delegates begininvoke


【解决方案1】:

从技术上讲,not a new thread 它是一个线程池线程,它的持续时间比您的进程/程序长,但可能会在完成您的线程后立即运行一些其他线程异步调用。查看 Asynch ProgrammingThreadpool 上的 MSDN 文章以获取完整的详细信息。

根据您的兴趣查看I/O CompletionPort 了解更多详情。

通常认为异步编程比至少同步代码更好,但如果您使用 .NET 4.0,请查看 Task Parallel Library

根据问题编辑,我应该什么时候创建自己的线程? 与创建自己的线程相比,使用 BeginInvoke 或 Async 编程总是更好。当您确定需要一个专用线程连续执行某些任务/工作并且您清楚应用程序中多个线程所需的同步机制时,请严格创建自己的线程。除非您有非常令人信服的理由,否则请尽可能避免创建新线程。您今天添加了一个线程,并且可能继续前进,两年后三个开发人员看到为一些连续的东西添加了一个额外的线程,他们会添加更多等等。相信我,我已经看到了这种情况,因此设置正确的做法(即使用异步方法),人们会尝试遵循这一点。我见过有 150 个线程的应用程序,这在双核或四核机器上有意义吗?我不这么认为。

刚刚检查了我的东芝笔记本电脑上所有正在运行的进程中是否存在设计不佳的应用程序,东芝蓝牙管理器使用 53 个线程赢得了我的机器上设计最差的程序的桂冠。 :)

【讨论】:

【解决方案2】:

它使用线程池 - 因此它不一定会创建一个新线程,但它在与调用线程不同的线程中运行(除非这是一个线程池线程 本身 恰好完成它的任务在委托调用被安排之前;它不太可能使用同一个线程)。

【讨论】:

  • 你有什么建议?这是一个好方法吗?请参阅我的问题中的编辑。
  • @Nawaz:这可能最好留给一个单独的问题。事实上,When to use a thread pool? 可能会有所帮助。
  • @Nawaz:你还没有真正说出目标是什么,所以很难知道这是否是一个好方法。它与使用 Dispatcher.BeginInvoke 非常不同 - 这是在 specific (UI) 线程上执行委托。
  • 目的是在非 UI 线程中进行一些数据库查询、处理等。
  • @TjadClark:您是否对Delegate.BeginInvokeControl.BeginInvoke 感到困惑?你指的是哪个文档?
【解决方案3】:

Dispatcher.CurrentDispatcher 是 WPF 中的新东西(有点取代 WinForms 中的 InvokeRequired 东西)。

您可以使用 Dispatcher 将您想要的任何更新排队到 GUI,它有不同的优先级可供您选择

this MSDN link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多