Lync SDK.多个UI线程出现问题
本文关键字:问题 线程 UI SDK 多个 Lync | 更新日期: 2023-09-27 18:28:09
我看到一个问题,使用Lync 2010 SDK控件的多个UI线程会导致程序崩溃。
我遇到的错误是:
{"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控件的限制。在内部,这些控件使用Lync客户端。作为COM包装器的lync客户端喜欢生活在单个UI线程上。
所以我想出了自己的控制方法。在生活在单个UI线程上的lync客户端上编写了一个facade。并向它发出了所有的电话。瞧,它在工作!
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(() =>
{
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(
Dispatcher.CurrentDispatcher));
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();
}
尝试设置新创建的线程的SynchronizationContext,如上所示。
如果Lync本身不允许Lync的一个以上实例,则此处给出的任何解决方案都不起作用。如果我还记得的话,这就是设计师想要的情况。Lync根本不会启动两次。