我有一个在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 A
是class 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
完成,您的对象(eventManager
,browse
,ScanForAxisCameras
)可能会被破坏并最终确定。因此,您正在寻找的事件(例如ServiceFound
)甚至没有机会被解雇。如果您调用
Application.Run()
,那么ScanForAxisCameras
不会退出(至少直到Application.Run()
本身退出时才退出)。这样可以使您的对象保持 Activity 状态和功能。尝试重构代码,以将对这些对象的引用保留在类的成员字段中(或在静态变量FWIW中)。我相信应该可以解决问题。
[编辑] 附带说明,在那种情况下
[STAThread]
属性没有意义(除非您将ScanForAxisCameras
用作新线程的入口点-显然,这里不是这种情况)。
关于c# - 仅当调用Application.Run()WPF应用程序时,代码才会启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095608/