WPF 调用库不起作用(线程问题)

Posted

技术标签:

【中文标题】WPF 调用库不起作用(线程问题)【英文标题】:WPF call to library not working (thread problem) 【发布时间】:2020-09-08 10:01:56 【问题描述】:

我有一个第三方库,我用它来生成某种消息。

我的代码在控制台应用程序中运行,但是当我从 WPF .xaml.cs 类调用它时,它什么也不做!

在调试中,我进入了 Produce(Message) 函数,然后什么都没有!我没有发现任何异常,也没有进入下一行。

完全相同的代码在控制台应用程序中完美运行。

帮助:(

        try
        
            Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
            _producer.Produce(message);
            Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
        
        catch (Exception e)
        
            Console.WriteLine(e);
            throw;
        

【问题讨论】:

【参考方案1】:

这是我为此目的编写的一个小类:

public class WaitCursor : IDisposable

    private Cursor _previousCursor;

    public WaitCursor()
    
        _previousCursor = Mouse.OverrideCursor;

        Application.Current.Dispatcher.Invoke(() => Mouse.OverrideCursor = Cursors.Wait);
    

    #region IDisposable Members
    public void Dispose()
    
        Application.Current.Dispatcher.Invoke(() => Mouse.OverrideCursor = _previousCursor);
    
    #endregion

像这样使用它:

using (var cursor = new WaitCursor())

    // Your long-running code here

【讨论】:

非常好!您可以考虑从class 切换到struct 作为WaitCursor 的类型,以避免一次分配的微小开销(微优化,我知道!)。【参考方案2】:

我已经通过将我的代码包含在一个方法中并执行以下操作来修复它:

        Task.Factory.StartNew(() =>
        
            ProduceMessage();
        );

【讨论】:

请注意,Task.Factory.StartNew 应该只是 Task.Run,并且应该等待:await Task.Run(() => ProduceMessage()); 这只是通过将问题推送到另一个线程来解决问题。

以上是关于WPF 调用库不起作用(线程问题)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PHP 媒体库不起作用?

Graphics.h 库不起作用

通过 CMake 生成的 TFLite 共享库不起作用

离子框架 - Angular:在我的 html 代码中包含库不起作用

将外部 jar 添加到 Maven 存储库不起作用 [重复]

在 Centos7 上用 gcc 链接静态库不起作用