林克 SDK 。多个 UI 线程的问题

Posted

技术标签:

【中文标题】林克 SDK 。多个 UI 线程的问题【英文标题】:Lync SDK . Issue with Multiple UI threads 【发布时间】: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 后端交互。跨度> 【参考方案1】:

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

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

【讨论】:

【参考方案2】:
    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。

【讨论】:

MainWindow 的构造函数中发生了什么?如果你把它剥离到InitializeComponent,它仍然会抛出错误吗? 是的,除了 InitializeComponent(),我的逻辑为零。 出于好奇,如果您从 xaml &lt;lync:PresenceIndicator Source="sip:gawicks@home.com"/&gt; 中删除此行,它仍然会抛出错误吗?如果不是,那么它确实看起来与 LYNC 有关 编辑:对不起,我的意思是如果 被删除,错误就会消失。所以我相当有信心这是 lync 特有的。【参考方案3】:

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

【讨论】:

是的,我知道。有几种等效的方法可以创建 WPF UI 线程。问题是,为什么 lync sdk 在这种情况下表现不正常。 好的,但是根据 Reed 的文章,上面的代码没有显示调度程序在新线程上的启动。你可以试试吗? 也许我们有点误解了这个问题,异常是在按钮点击逻辑中发生还是在按钮点击之前显示主窗口时发生? 按钮点击逻辑触发一个新的 UI 线程。异常就是在这里发生的。

以上是关于林克 SDK 。多个 UI 线程的问题的主要内容,如果未能解决你的问题,请参考以下文章

Android SDK使用HttpClient的问题,为啥老是报错,困扰了我好几天,求大神解救!

Unity接第三方SDK时遇到的坑

如何在多个线程中访问 UI 元素?

从非 ui 线程设置剪贴板

如何检查是不是在 Android 的 UI 线程上运行? [复制]

如何在多个任务之后继续而不阻塞 UI 线程?