林克软件开发工具包。多个 UI 线程的问题
Lync SDK . Issue with Multiple UI threads
我发现有多个 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();
}
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 实例,None 此处给出的解决方案将有效。如果我记得的话,情况就是这样,因为设计师希望这样。 Lync 根本不会启动两次。
看来这确实是Lync控件的局限性。这些控件在内部使用 Lync 客户端。作为 COM 包装器的 lync 客户端喜欢在单个 UI 线程上运行。
所以我想出了自己的控件。在生活在单个 UI 线程上的 lync 客户端上写了一个外观。并调度所有调用它。瞧,它正在工作!
我发现有多个 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();
}
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。
None 此处给出的解决方案将有效。如果我记得的话,情况就是这样,因为设计师希望这样。 Lync 根本不会启动两次。
看来这确实是Lync控件的局限性。这些控件在内部使用 Lync 客户端。作为 COM 包装器的 lync 客户端喜欢在单个 UI 线程上运行。
所以我想出了自己的控件。在生活在单个 UI 线程上的 lync 客户端上写了一个外观。并调度所有调用它。瞧,它正在工作!