BeginInvoke()是否运行单独的线程?

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

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

代表被定义为,

 public delegate void AsyncMethodCaller(IEnumerable data); 

我的问题是:

BeginInvoke()是否创建了一个新线程并且回调SetPatternType在其中运行? 如果是这样,这个post能持续多久?

这种方法总的来说好吗? 如果没有,它有什么问题? 我可能面临哪些潜在的问题?

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


编辑:

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

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

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

根据您的兴趣检查I / O CompletionPort以获取更多详细信息。

Asynch编程通常被认为比至少同步代码更好,但是你在.NET 4.0上看看任务并行库 。

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

刚刚检查了我的东芝笔记本电脑上所有正在运行的程序,这些设计糟糕的应用程序,东芝蓝牙管理器使用53个线程赢得了我的盒子上设计最差的程序的王冠。 🙂

它使用线程池 – 因此它不一定会创建一个新线程,但它在与调用线程不同的线程中运行(除非这是一个线程池线程本身 ,它在调度委托调用之前就完成了它的任务;它将不太可能使用相同的线程)。

Dispatcher.CurrentDispatcher是WPF中的新东西(在WinForms中替换InvokeRequired的东西)。

您可以使用Dispatcher将所需的任何更新排入GUI,并且它具有您可以选择的不同优先级

看到这个MSDN链接