在c#对象的构造函数中等待Javascript回调

在c#对象的构造函数中等待Javascript回调,c#,javascript,webbrowser-control,C#,Javascript,Webbrowser Control,当通过webbrowser控件构造时,我的C#对象将调用一些JavaScript。然后JavaScript会成功或失败地调用我们的c代码。我需要让C#对象的构造函数等待JavaScript返回回调后再离开构造函数。我该怎么做呢 本质上,我需要确保对象在创建时总是正确初始化。这取决于javascript的回调,这至少是一个微小的变量 您应该: 以不依赖于Javascript调用的方式构造对象 调用您需要的任何逻辑,这些逻辑将在.NET边界之外完成,当Javascript完成并响应时 。。。调用一

当通过webbrowser控件构造时,我的C#对象将调用一些JavaScript。然后JavaScript会成功或失败地调用我们的c代码。我需要让C#对象的构造函数等待JavaScript返回回调后再离开构造函数。我该怎么做呢


本质上,我需要确保对象在创建时总是正确初始化。这取决于javascript的回调,这至少是一个微小的变量

您应该:

  • 以不依赖于Javascript调用的方式构造对象
  • 调用您需要的任何逻辑,这些逻辑将在.NET边界之外完成,当Javascript完成并响应时
  • 。。。调用一些
    initialize()
    方法(将其命名为那样或类似的名称)

您可以在每个实例中都有一个标志,告诉您is是否已经通过了后Javascript初始化,并在您的类中有一些逻辑,以便在初始化步骤之后,它的实例只能被视为处于有效、就绪、可用的状态。祝您好运,编码愉快:)

虽然您不能在构造函数中使用
async/await
,但仍然可以进行异步JavaScript调用并等待其完成,这取决于您在JavaScript中实际执行的操作以及从JavaScript到C的回调中的操作。它是通过组织一个嵌套的消息循环来完成的,下面是一个示例。注意,这可能是危险的,因为它可能导致代码重入


也就是说,您仍然可以使用Stephen Cleary在中描述的方法之一重构代码以使用
async/await

相关:仅依靠工厂方法创建这样的对象可能会更容易、更安全,并确保调用方只能通过这样的方法构造实例,而不是这样做。建议的副本中也描述了这一点。因此,即使我有一个工厂,我如何确保javascript已正确初始化?鉴于此操作的变量性质,如果对象未正确初始化,工厂将返回null,如果对象已正确初始化,工厂将返回正确的对象。我需要确保每次请求这个对象时,它都会被正确初始化(这意味着javascript将成功回调)。我认为工厂模式与这里的问题和解决方案无关。@Tim工厂将返回一个
任务
。如果创建操作失败,您可以让它将任务标记为有故障,也可以让它继续重试,直到成功为止(或在多次尝试后出错)。@Renan不是这样,因为通过添加外观,可以防止对象的使用者获得未完全初始化的对象,而你的依赖于消费者正确使用它来避免问题。使用工厂方法,您可以确保在对象正确初始化之前,不会向它们提供对象。这是一个关键区别。