【问题标题】:C# WinForms - Determine when void method returnsC# WinForms - 确定 void 方法何时返回
【发布时间】:2017-03-30 17:24:07
【问题描述】:

我试图弄清楚当我正在处理的程序的 void 方法返回时如何确定最佳实践。基本上,该程序调用了第 3 方网格,告诉它将内容保存到 Excel 工作表中。保存网格的方法是一个void方法grid.SaveExcel(string filename, ...)。我在想它需要使用awaitasync 命令,但在多个地方读到这不是最佳实践。我很好奇你将如何正确地做到这一点,因为我是 C# 中 awaitasync、Lamda、Invoke、ActionTaskdelegate 的菜鸟,我想我只是让我自己感到困惑。我基本上知道如何打开 SQL 连接、填充网格、处理按钮事件处理程序、构建基本类等(非常基本的东西)。

我基本上想调用grid.SaveExcel 方法,然后在等待网格保存完成时更新进度条。完成后,我想继续接下来的几行代码。有人可以帮我指出正确的方向并向我展示一些代码来尝试实现这一点吗?提前致谢!

【问题讨论】:

  • grid.SaveExcel 不是标准 .NET Framework 中的方法。这个从哪里来?它的定义是什么?是阻塞(同步)方法还是非阻塞(异步)方法?
  • 我正在为 WinForms 使用 ComponentOne 控件。这是他们的 C1FlexGrid (componentone.com/Studio/FlexGrid?platform=WinForms)。我不确定它是否阻塞。保存时间从几秒到一分钟不等,具体取决于网格中加载了多少数据。我希望能够手动增加我在保存时显示的进度条。
  • 如果该方法不提供报告进度的方法,您将无法报告进度。 That method 不提供任何东西。您可以在单独的线程上运行它以避免阻塞 UI,但您不会获得进展。至于它什么时候完成,就是执行到你在调用该方法之后放置的下一条指令时。

标签: c# winforms async-await void


【解决方案1】:

您可以在 BackgroundWorker 上调用您的函数。 https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx

然后,此类将在完成时自动引发事件,并允许您在执行期间报告进度,这也会在您的对象调用线程上引发事件。以下是设置的一个过程: https://www.dotnetperls.com/backgroundworker

所有这一切都假设您确实需要这个过程是异步的。如果您不这样做,您可以简单地调用您的保存,然后立即使用您想要的任何保存后功能跟随它。如果保存时间少于 200 毫秒,最好将其内联到 UI。

【讨论】:

  • 背景是非常古老和过时的方法,只有当它是 .Net 3.5 上的遗留项目时才应该使用
  • 我认为“过时”这个词太强了。正如这个线程(双关语)所表明的,这是一个有争议的话题:stackoverflow.com/questions/12414601/… 如果你想报告进度,BGW 作为初学者很容易实现。由于用户状态是一个对象,因此您可以根据需要随时将任何内容发送回调用线程,并且这样做的方法内置于对象中。我并不是说它比 async/await 更好,但与 String.Format 相比,它在插值方面没有那么明显,这在几乎所有情况下都更清晰。
  • 报告进度的新方法是Progess 类。 BGW 可以轻松替换为TPL 和/或async/await
  • 而 BGW 在 .Net 4.5 中被明确标记:stackoverflow.com/a/16366418/213550
  • @VMAtm 该答案下的very first comment 更正了这一说法。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
相关资源
最近更新 更多