c# - 仅当调用Application.Run()WPF应用程序时,代码才会启动

标签 c# wpf multithreading

我有一个在class A中调用的方法,它在class B中定义:

class B{
      [STAThread]
        public static void ScanForAxisCameras() {
                DNSSDService service = new DNSSDService();
                DNSSDEventManager eventManager = new DNSSDEventManager();
                eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound);
                DNSSDService browse = service.Browse(0, 0, "_axis-video._tcp", null, eventManager);
                Application.Run();//if not invoked everything above does not start
            }
}
class A{ ...before invoking..... B.ScanForAxisCameras(); ....after invoking....}

仅当我调用class B时,Application.Run()中的代码才能“启动”/起作用。 ,但是这会导致class A ....after invoking....方法中的所有代码都不起作用。如何处理它,使其不会冻结应用程序?

编辑:class Aclass MainWindow.xaml.cs。它是WPF应用程序。
public partial class MainWindow : Window {

        public MainWindow() {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e) {
            createGUI();
        }

        private void createGUI() {

            LocalNetworkScanner.ScanForAxisCameras();//when there is no Application.Run()  ScanForAxisCameras() does not work.
}
}

最佳答案

您在其上调用ScanForAxisCameras()的WPF UI线程已经具有消息循环。我相信您的代码存在的问题是您在ScanForAxisCameras 内部创建的所有对象都具有本地范围:

public static void ScanForAxisCameras() {
        DNSSDService service = new DNSSDService();
        DNSSDEventManager eventManager = new DNSSDEventManager();
        eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound);
        DNSSDService browse = service.Browse(0, 0, "_axis-video._tcp", null, eventManager);
        Application.Run();//if not invoked everything above does not start
}

没有Application.Run(),一旦service完成,您的对象(eventManagerbrowseScanForAxisCameras)可能会被破坏并最终确定。因此,您正在寻找的事件(例如ServiceFound)甚至没有机会被解雇。

如果您调用Application.Run(),那么ScanForAxisCameras不会退出(至少直到Application.Run()本身退出时才退出)。这样可以使您的对象保持 Activity 状态和功能。

尝试重构代码,以将对这些对象的引用保留在类的成员字段中(或在静态变量FWIW中)。我相信应该可以解决问题。

[编辑] 附带说明,在那种情况下[STAThread]属性没有意义(除非您将ScanForAxisCameras用作新线程的入口点-显然,这里不是这种情况)。

关于c# - 仅当调用Application.Run()WPF应用程序时,代码才会启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095608/

相关文章:

c# - IOS 到 C# 什么等同于 id<>

c# - VS C# 连接mySQL 数据库

wpf - 如何在 XAML 中绘制一个 'felt pen' 样式的圆而不结束连接

wpf - 如何使裁剪几何与目标一起缩放?

c# - 在 C# (ASP.NET) 中使用 HTML 数组

wpf - WPF 中的条件数据模板

multithreading - 在等待通知std::condition_variable的过程中执行 “wait callback”

java - 可以传递给 ExecutorService 的对象,并且 Runnable 之间具有依赖关系

java - 包含处于 RUNNABLE 状态且没有堆栈的线程的线程转储

c# - 将 XML 传递给 Web 服务的最佳方法?