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

Naw*_*waz 9 c# wpf multithreading delegates begininvoke

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

var caller = new AsyncMethodCaller<Pattern>(this.SetPatternType);
caller.BeginInvoke(_patterns, null, null);
Run Code Online (Sandbox Code Playgroud)

代表被定义为,

public delegate void AsyncMethodCaller<in T>(IEnumerable<T> data);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

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

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


编辑:

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

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

San*_*ath 12

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

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

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

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

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


Jon*_*eet 9

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