gpt4 book ai didi

c# - 我可以让异步组件看起来是同步的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:20 25 4
gpt4 key购买 nike

我目前正在尝试解决一个初始化问题,该问题源于所有子组件同步初始化的假设。

UI 实例化一个具有自己的 UI 的类。它看起来像这样:

ConfWizard cf = new ConfWizard();
cf.ShowDialog();

问题在于 ConfWizard 类使用了另一个异步初始化的类,但必须在调用 ShowDialog 之前准备好才能正常运行。 ConfWizard 代码类似于:

public ConfWizard()
{
helper = new HelperClass
helper.ReadyEvent += new HelperClass.ReadyEventHandler(this.helper_ReadyEvent)
helper.StartUp();
// Do more initialization using properties of hc
}

private helper_ReadyEvent()
{
//HelperClass is ready to use
}

由于可能直到引发 ReadyEvent 之前才设置 helper 的属性,因此当前构造函数通常无法正确初始化。将剩余的初始化放入 helper_ReadyEvent 似乎很明显,但这会导致构造函数在对象准备好使用之前返回。由于使用 ConfWizard 对象的类假设一旦构造函数返回对象就完全可以使用,过早返回是不可取的。

不幸的是,我无法更改 HelperClass,因此我需要以某种方式屏蔽其异步行为,以便可以同步使用 ConfWizard 类。

我尝试使用 ManualResetEvent 对象(在事件处理程序中调用 Set),但对 WaitOne 的调用处于阻塞状态,因此事件未在挂起应用程序时得到处理。

关于如何在 .NET1.1 中实现这一点有什么想法吗?

更新 - 2009 年 8 月 21 日
我今天有时间进行实验,以下是我的发现。

WaitOne - 如果给定足够大的超时时间,则每次只需停止应用程序即可。不幸的是,超时需要至少 5 秒(比我愿意等待的时间长)。没有超时,它仍然挂起。调用 set 的事件根本不会发生。

休眠 - 与 WaitOne 相同,超时时间足够长,它似乎可以正常工作。

线程 - 我不希望 UI 在初始化完成之前继续,因为 UI 的行为会被初始化结果改变。但是,将 HelperClass 对象的初始化拆分到一个单独的线程中并调用 Thread.Join 来暂停主线程是可行的。

所以问题的解决方案似乎是以正确的方式使用多线程。

最佳答案

您修改它并在配置向导上添加一个只读属性,只要调用 helper_ReadyEvent 委托(delegate),该属性就会设置为 true。然后,您可以轮询属性并在表单准备就绪后显示对话框。

ConfigWizard wiz = new ConfigWizard();
while (!wiz.Ready) System.Threading.Thread.Sleep(2000);
wiz.ShowDialog();

或者,您不能在初始化 ConfigWizard 之前初始化辅助类吗??那么您可以只提供对已通过类构造函数初始化为配置表单的帮助程序类的引用吗?鉴于此处的回复数量,在我看来,您可以通过多种方式完成任务。

关于c# - 我可以让异步组件看起来是同步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com