【问题标题】:Awaiting Javascript callback while in constructor of c# object在 c# 对象的构造函数中等待 Javascript 回调
【发布时间】:2013-09-23 16:01:42
【问题描述】:

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

基本上,我需要确保对象在创建时始终正确初始化。这取决于 javascript 回调,这至少略有不同。

【问题讨论】:

标签: c# javascript webbrowser-control


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您应该:

    而不是使用异步构造函数(which is not possible with .NET, anyway(感谢 Servy)(如果存在这样的事情,我认为任何其他允许这样做的框架都不是一个健全的框架)):
    • 以不依赖于 Javascript 调用的方式构造对象;
    • 调用您需要的任何逻辑,这些逻辑将在 .NET 边界之后完成,并且当 Javascript 完成并做出响应时...
    • ... 调用一些initialize() 方法(这样命名或类似名称)。

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

    【讨论】:

    • 仅依靠工厂方法来创建此类对象,并确保调用者可以通过此类方法构造实例,而不是这样做.建议的副本中也对此进行了描述。
    • 所以即使我有一个工厂,我如何确保 javascript 已正确初始化?鉴于此操作的可变性质,工厂将在未正确初始化的对象的情况下返回 null,或者在正确初始化的情况下返回正确的对象。我需要确保每次请求此对象时,它都会正确初始化(意味着 javascript 将成功回调)。
    • 不管怎样,你只需要按照我在工厂里的建议去做。我认为工厂模式与这里的问题和解决方案是相切的。
    • @Tim 工厂将返回Task<Whatever>。如果创建操作失败,您可以让它将任务标记为错误,或者您可以让它继续重试直到成功(或在设定的尝试次数后出现错误)。
    • @Renan 不是,因为通过添加外观,您可以防止对象的消费者获得未完全初始化的对象,并且您的消费者依赖于消费者正确使用它来避免问题。使用工厂方法,您可以确保在正确初始化之前不会为它们提供对象。这是一个关键的区别。
    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2010-10-14
    • 2011-02-20
    • 2012-09-21
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多