【问题标题】:How to know if a winform launch takes more than 5 seconds? [closed]如何知道 winform 启动是否需要超过 5 秒? [关闭]
【发布时间】:2016-05-29 16:03:17
【问题描述】:

我有一种情况,我必须使用 c#-Winform 中的编码创建一些机制,这样当我启动任何特定的 winform 时,如果启动时间超过指定的秒数(比如说 10 秒),那么我必须显示一个loader(ajax loader 类型的东西),直到我没有完全显示表单。 (这个表格需要很多时间,因为它在大量计算后显示数据,所以我希望同时显示一些加载器)。

I successfully designed the circle like loader。现在的问题是:

(1.) 如何知道表单启动时间是否超过 10 seconds ?所以我启动加载程序。

(2.) 另一个问题是我必须让它适用于所有共同的表单(因为项目非常大,所以我不想为每个单独的表单编写加载器的代码,我想知道任何方法来实现全局此功能,如果任何当前启动的表单花费超过 10 秒,那么它会显示加载器(并且应该适用于所有启动时的表单,如果它们花费超过 10 秒而不编写代码以显示在每个单独的表单上)并停止加载器如表格所示。

如何实现这两个功能?

【问题讨论】:

  • 为什么要等十秒钟?如果花费的时间是 10.5 秒呢?作为用户,我一直在等待表单完成,并且仅等待 0.5 秒,我得到一个指示需要一段时间。你不能根据你需要做的计算次数来显示一个加载器吗?另外,在构造函数中,繁重的工作在哪里完成?负载?请显示代码以及到目前为止您提出的内容(计时器?)
  • 我不知道你为什么要为此烦恼。标准的习惯用法是显示一个 busy 光标。你肯定见过。您只需在加载操作之前显示它,一旦加载完成,忙碌光标将自动消失。或者,您可以只显示您的小加载动画,执行任务,并在完成后删除加载动画。尝试编写时间检测代码是不值得的。
  • @CodyGray 我不允许在每个单独的表单上编写代码......因为项目非常大。是否有任何解决方案可以在全局范围内实现它,而不是为 loader 的每个表单编码?
  • @user3085082 是从基本形式派生的形式,如果是这样,您也许可以在那里做一些魔术。否则我看不到该怎么做。如果项目的规模使人们不允许您进行改进,那么您显然会有更大的担忧。
  • 是的,有一个主winform,菜单中有各种子项。在每个菜单上单击我们都会启动一个子窗体来进行计算。那么如何在这个主窗口窗体上实现这种魔力呢?

标签: c# .net multithreading winforms process


【解决方案1】:

只有在后台线程中处理数据时才能执行此操作,否则表单将被阻止并且您无法进行任何更改。

因此,如果它在单独的线程中执行工作,请尝试以下操作:

  1. 创建一个基类并实现。

    1. 一个。写一个名为 DataLoaded 之类的标志。
    2. 乙。编写一个名为 OutOfTime 的标志。
    3. c。动态创建要显示的加载程序所需的控件。
  2. 在基类中使用 Timer(有 3 个不同的,请明智地选择)并在 X 秒内调用一个方法。
  3. 如果 !OutOfTime 设置 DataLoaded = true 则在加载数据时关闭/隐藏加载器,以防它在下一步中显示。
  4. 当 Timer 的事件/方法被调用时,检查是否加载了数据,如果没有,这意味着在这 X 秒内它们仍在处理,所以显示/调用/显示加载器。

只是一个想法,一开始可能行不通,但这或多或少是我会做的:)

【讨论】:

  • 问题将是..如何知道数据是否加载? (我的意思是如果设置了 10 秒,则何时停止加载程序。即我知道何时启动加载程序(当表单未在 10 秒内加载时)但如何知道表单是否已加载?
  • True xD 我知道这太容易了 C:对不起,按错了输入。你是如何获取数据的?您使用的是哪个框架?给我详细一点。你有多少表格?可能是一个简单的解决方案,只需在每个表单上调用一个小的 this.DoneLoading()。
  • 感谢您的回复。 (1)我有主窗口窗体。它有几个菜单,分别单击会给出单独的窗体( Form1 frm1 =new Form1(); frm.showdialog(); 然后这个窗体在从用户那里获取一些数据进行计算后会弹出另一个窗体并通过弹出第三种形式在确定按钮单击上显示计算结果,我在单击此按钮的确定时进行复杂的数学计算,这需要时间和表单弹出很晚)并且有 100 个这样的形式,所以我的老板想要一个全球解决方案,而不是在每个表单后面编码。我正在使用 .NET 4.5
  • 你没有回答这个问题:计算是在同一个线程中完成的吗?如果它们在不同的线程中,那么正如您之前所说的那样,问题在于没有简单的方法可以知道数据何时完成。这将是更复杂但并非不可能的事情。如果计算/数据检索是手动完成并硬编码到每个表单中,那么除了硬编码 this.DoneLoading() 之外别无选择。这是最好的方法,因为您可以打开多个表单,这可能会导致错误。
  • 它在同一个线程中......但是为了加载我想我们需要创建另一个线程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2010-11-02
相关资源
最近更新 更多