WPF线程问题

时间:2011-05-17 17:27:30

标签: wpf multithreading

我有一个非常复杂的WPF应用程序,我显示和处理的页面都在dll中。到目前为止,此工作正常。

我在应用程序的主页面中设置了一个计时器,用于查找来自外部源的通信。当我得到一个沟通(而且我很模糊,不要加入混乱)我解析它,如果消息是“xyx”,我需要启动XYL dll的UI。我得到调用线程必须是sta因为许多ui组件需要这个。 我在Web上看到有关必须调用Invoke()的文章,我不能使用工作线程而是使用后台线程。

我的问题是我正在使用的System.Timers.Timer吗?这会导致工人线程吗?我不知道在我的调用中我需要启动一个线程来运行它(或者如何处理它)。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

计时器通常在线程池线程上运行,这是MTA。

请改用DispatcherTimer或使用Dispatcher.Invoke。然后,dll的UI将在与主页的UI(即STA)相同的线程上运行

如果你想让dll的UI在不同的线程上运行,你需要自己创建线程并将其设置为STA。

答案 1 :(得分:0)

System.Timers.Timer在工作线程上运行,无法访问UI元素。有关详情,请参阅herehere

使用那种计时器是可以的,你只需要在触摸UI部分之前回到UI(调度程序)线程。您可以通过调用Dispatcher.InvokeDispatcher.BeginInvoke并传入要运行的委托来执行此操作。这将把新的UI片段放到原始UI线程上。如果您希望它们在自己的UI线程上运行(可能在不同的窗口中),那么您需要自己设置它。