我的一般性问题是:您如何编写仍然清晰且易于遵循的异步代码,就像同步解决方案一样?
我的经验是,如果你需要使一些同步代码异步,使用像 BackgroundWorker 这样的东西,你不再有一系列易于遵循的程序语句来表达你的整体意图和活动顺序,你最终会得到一堆“完成”事件处理程序,每个处理程序都启动下一个 BackgroundWorker,生成的代码非常难以遵循。
我知道这不是很清楚。更具体的东西:
假设我的 WinForms 应用程序中的一个函数需要启动一些亚马逊 EC2 实例,等待它们开始运行,然后等待它们全部接受 SSH 连接。伪代码中的同步解决方案可能如下所示:
instances StartNewInstances() {
instances = StartInstances()
WaitForInstancesToBecomeRunning(instances)
WaitForInstancesToAcceptSSHConnection(instances).
return (instances)
}
那很好。发生的事情很清楚,程序动作的顺序也很清楚。没有白噪音分散您对代码和流程的理解。我真的很想得到看起来像这样的代码。
但实际上,我不能有一个同步的解决方案..这些功能中的每一个都可以运行很长时间,并且每个都需要执行以下操作:更新 ui,监控超时,并定期重试操作,直到成功或超时。简而言之,这些都需要在后台发生,以便前台 UI 线程可以继续运行。
但是,如果我使用像 BackgroundWorker 这样的解决方案,似乎我最终不会像上面那样轻松地遵循程序逻辑。相反,我可能会从我的 UI 线程启动一个后台工作程序来执行第一个功能,然后我的 ui 线程在工作线程运行时返回到 UI。当它完成时,它的“完成”事件处理程序可能会启动下一个后台工作程序。当它完成时,它的“完成”事件处理程序可能会启动最后一个 BackgroundWorker,依此类推。这意味着您必须“跟踪”完成事件处理程序才能了解整个程序流程。
必须有一种更好的方法a)让我的UI线程响应,b)让我的异步操作能够更新ui,最重要的是c)能够将我的程序表达为一系列连续的步骤(就像我已经如上所示)以便有人可以理解生成的代码
任何和所有输入将不胜感激!迈克尔