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 Programming和Threadpool上的MSDN文章以获取完整的详细信息.
并根据您的兴趣检查I/O CompletionPort以获取更多详细信息.
Asynch编程通常被认为比至少同步代码更好,但是你在.NET 4.0上看看任务并行库.
基于问题编辑,我应该何时创建自己的线程?与创建自己的线程相比,使用BeginInvoke或Async编程总是更好.当您确定需要专用线程连续执行某项任务/工作并且您清楚应用程序中多个线程所需的同步机制时,严格创建自己的线程.除非你有一个非常令人信服的理由,否则尽可能避免创建新线程.你今天添加一个线程,可能继续前进,两年后,三个开发人员看到为一些连续的东西添加了一个额外的线程,他们将添加更多等等.相信我,我已经看到了这种情况,因此设置了正确的做法(即使用Asynch方法),人们将尝试遵循这一点.我见过150个线程的应用程序,这在双核或四核机器上是否有意义,我不这么认为.
刚检查了我的东芝笔记本电脑上所有正在运行的进程,这些设计糟糕的应用程序,东芝蓝牙管理器使用53个线程赢得了我的盒子上设计最差的程序的冠军.:)
它使用线程池 - 因此它不一定会创建一个新线程,但它在与调用线程不同的线程中运行(除非这是一个线程池线程本身,它在调度委托调用之前就完成了它的任务;它将不太可能使用相同的线程).
| 归档时间: |
|
| 查看次数: |
7130 次 |
| 最近记录: |