0

我看到一个问题,即使用 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();

        }
4

3 回答 3

1

似乎这确实是 Lync 控件的限制。这些控件在内部使用 Lync 客户端。作为 COM 包装器的 lync 客户端喜欢存在于单个 UI 线程上。

所以相反,我想出了自己的控制。在单个 UI 线程上的 lync 客户端上编写了一个外观。并调度所有呼叫它。瞧,它的工作原理!

于 2016-03-20T06:09:13.577 回答
0
    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,如上所示。

于 2015-12-28T05:37:15.887 回答
0

如果 Lync 本身不允许 Lync 的单个实例以上,则此处给出的任何解决方案都不起作用。如果我记得,这就是设计师想要的那样。Lync 根本不会启动两次。

于 2015-12-28T05:41:39.217 回答