2011-04-07 112 views
8

在我的WPF应用程序中,我想在非UI线程中做一些工作,以避免UI变得不响应。对于我这样做:BeginInvoke()是否运行单独的线程?

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()对象?

+0

你用什么.NET版本? – PVitt 2011-04-07 08:09:27

+0

@PVitt:我想...我使用.NET 4.0,因为我使用Visual Studio 2010. – Nawaz 2011-04-07 08:11:10

回答

10

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

,并根据了解更多详细信息的兴趣检查I/O CompletionPort

非同步编程通常被认为比ATLEAST同步码好,但F你是在.NET 4.0看一看Task Parallel Library

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

刚才检查我的东芝笔记本电脑的所有正在运行的进程这样的设计拙劣的应用程序,东芝蓝牙管理器获得使用53个线程我的盒子设计最糟糕的程序的桂冠。 :)

8

它使用线程池 - 所以它不一定会创建一个新的线程,但它运行在与调用线程不同的线程中(除非这是线程池线程本身恰好在委托调用是预定的;它将不太可能使用相同的线程)。

+1

你有什么建议?这是一个好方法吗?请参阅我的问题中的编辑。 – Nawaz 2011-04-07 08:14:39

+0

@Nawaz:这可能是最好留给一个单独的问题。实际上,[何时使用线程池?](http://stackoverflow.com/questions/145304/when-to-use-thread-pool-in-c)可能会有所帮助。 – ladenedge 2011-04-07 08:29:11

+0

@Nawaz:你没有真正说过目标是什么,所以很难知道它是否是一个好方法。这与使用Dispatcher.BeginInvoke非常不同 - 这是在*特定*(UI)线程上执行委托。 – 2011-04-07 08:45:40

2

调度。CurrentDispatcher是WPF中的新东西(用于替换WinForms中的InvokeRequired东西)。

您可以使用调度排队要在GUI任何更新,它有不同的优先级,你可以选择从

看到this MSDN link

相关问题