【发布时间】:2015-12-28 05:11:42
【问题描述】:
我看到一个问题,即多个 UI 线程与 Lync 2010 SDK 控件一起导致程序崩溃。
我遇到的错误是:
{"Must create DependencySource on same Thread as the DependencyObject."}
如果有人可以解释为什么会发生这种情况,或者如何解决这个问题。会很棒!
<Window x:Class="Lync.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:lync="clr-namespace:Microsoft.Lync.Controls;assembly=Microsoft.Lync.Controls"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<lync:PresenceIndicator Source="sip:gawicks@home.com"/>
<Button Height="20" Width="20" Click="Button_Click"> </Button>
</StackPanel>
</Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
//Simply creating another UI thread on button click https://eprystupa.wordpress.com/2008/07/28/running-wpf-application-with-multiple-ui-threads/
Thread thread = new Thread(() =>
{
MainWindow w = new MainWindow();
//Crash!!
w.Show();
w.Closed += (sender2, e2) =>
w.Dispatcher.InvokeShutdown();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
【问题讨论】:
-
该问题与 LYNC 无关,而是尝试在当前窗口正在运行的线程之外的某个线程上启动新 GUI 的问题。摆脱你的线程逻辑,你会没事的。
-
要求是在新线程上运行。哪个应该工作eprystupa.wordpress.com/2008/07/28/…。所有其他控件工作正常。我可以确认是 lync 控件导致了问题。
-
设置ApartmentState后尝试设置thread.IsBackground = true
-
好的。您可以尝试的另一件事是设置 SynchronizationContext(在线程启动中,在主窗口初始化之前),如下所示:
SynchronizationContext.SetSynchronizationContext( new DispatcherSynchronizationContext( Dispatcher.CurrentDispatcher)); -
Lync 客户端 SDK 有点垃圾。它在线程方面有一些严重的问题。如果微软能够进行更新,那就太好了 - 但事实上,如果可能的话,构建自己的 UI 元素会更容易与体面的多线程 UCMA 或 UCWA 后端交互。跨度>
标签: c# .net wpf lync lync-client-sdk