【发布时间】:2014-01-13 15:55:16
【问题描述】:
我有一个在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.
}
}
【问题讨论】:
-
这是一个 winform 应用程序,一个 Web 应用程序,还是什么?此时您是否已经启动了消息循环?您稍后会开始消息循环吗?
-
如果你不打电话给
Run,那么消息循环就不会开始,所以是的,在你打电话之前你不会收到任何通知是有道理的。 -
@BartoszKP “没有事件循环,事件就无法工作。”这根本不是真的。大多数事件永远不会使用消息循环。只有当代码试图编组到 UI 线程(甚至不需要来自事件)时,这才是一个问题。
-
@Servy 是的,你是对的。很抱歉造成混乱。
-
您绝对不应该在 WPF 应用程序中调用
Application.Run。您正在使用的第 3 方组件中存在错误,它被设计为仅用于 WinForms,而不是 WPF,或者您没有以某种方式正确使用它。
标签: c# wpf multithreading