【问题标题】:User wait for some time用户等待一段时间
【发布时间】:2013-02-23 12:44:25
【问题描述】:

我需要解决一个问题并需要一些意见。当我按button1 时,我的 gui 启动串行通信。我发送一些命令并接收一些数据。一旦我按下button1,我就会在另一个线程(GUI 线程除外)中持续 3-4 秒,直到数据完全传输。当我按下button1 时,我想要一个对话框、弹出窗口或类似的东西(显示忙碌消息)出现在我的 gui 前面,并且此弹出窗口在串行通信正在进行的另一个线程中自动关闭整个数据传输的地方。

有人建议BackgroundWorker,但我不清楚。

我也有一个建议 " 使用一个 winform,将它的 FormBorderStyle 设置为 FixedDialog。让它像消息框一样小,并在上面放一个进度条控件。您可以在线程处理开始时使用表单 ShowDIalog,最后关闭。为简单起见,进度条样式可以设置为连续。"

考虑到我的情况,有什么好的解释或替代的简单方法? 我想让事情变得简单

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以在表单上使用标签设置简单的消息,或者在执行几个命令后使用进度条和更新进度条。如果您的命令集是由用户指令启动的,那么就可以了。 如果您必须与设备通信并响应设备警报,则 C# 中串行端口的 DataReceivedEvent 可以正常工作。你可以编写你的代码。当设备将日期传输到应用程序并在后台工作时,此事件会被触发。

    【讨论】:

      【解决方案2】:

      逻辑如下:

      • 当用户点击 button1 时,弹出框会显示一些内容。
      • 同时,数据传输代码也应该在同一个线程中。
      • 然后编写代码以获取所有数据将被传输的点&@该点使该对话框消失。

      如果您想要任何示例代码,请也发布您编写的代码,以便我可以提供实用的代码来向您展示逻辑。

      希望您理解或更好地发布您的代码。

      【讨论】:

      • 感谢您的回复。实际上,对于这部分,我还没有任何代码。目前我拥有的是一个简单的按钮,带有一个相关的点击事件,我在其中启动串行通信。正如你所知,c# 有一个用于串行通信的接收函数,它是一个单独的线程,这就是我要关闭弹出窗口的地方。
      • 此外,您能否详细说明您在这里指的是哪种“弹出框”(我不能使用消息框,对吗?)。我需要制作自定义弹出窗口还是什么?
      • 你也可以制作自己的服装控制,但在我看来,很难做到那种单一的控制。并且您绝对可以以这种方式使用消息框: System.Windows.Forms.MessageBox.Show("My message here");确保您的项目引用了 System.Windows.Forms 程序集。
      【解决方案3】:

      BackgroundWorker 确实是最好的选择。 here.

      【讨论】:

      • 感谢您的回复。一问,后台工作人员会影响我目前的实施吗?如果是,以什么方式?因为我希望尽可能减少对当前代码的更改
      • 是的,它会的。但是,您需要一种在后台处理内容的方法,因此任何后台工作人员都会影响您的实施。使用线程或任务查看其他答案中发布的代码。 BackgroundWorker 将承担同样多的工作。
      【解决方案4】:

      您没有说明您正在运行的 .net 版本,所以我将提供这两种方法:

      .net 4:

      void OnButton1Click(Object sender, EventArgs e)
      {
      
          var waitDailog = new frmWait();
          waitDialog.ShowDialog();
      
          var task = new Task(() = 
          {
              // Serial communitcation or whatever will take a long time here
          })
          .ContinueWith(result =>
          {
              waitDialog.Close();
          })
          .Start();
      }
      

      .net 3:

      private frmWait _waitDialog;
      
      void OnButton1Click(Object sender, EventArgs e)
      {
      
          _waitDailog = new frmWait();
          waitDialog.ShowDialog();
      
          var thread = new Thread(OnThread);
          thread.Start();
      }
      
      void OnThread()
      {
          // Serial communitcation or whatever will take a long time here
      
          _waitDailog.Close();
      }
      

      在这两种情况下,等待对话框只是一个表单,带有某种动画和消息来显示等待。

      您可能还需要一些 Invoke() 来关闭等待表单,但我手边没有编译器可供检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 2014-12-29
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        相关资源
        最近更新 更多