C# 用户等待一段时间

C# 用户等待一段时间,c#,C#,我需要解决一个问题,需要一些输入。当我按下按钮1时,我的gui启动串行通信。我发送一些命令并接收一些数据。按下按钮1后,我在另一个线程(GUI线程除外)中停留3-4秒,直到数据完全传输。我想要的是当我按下按钮1时,在gui前面出现一个对话框、弹出窗口或类似的东西(显示一条繁忙的消息),当传输整个数据时,该弹出窗口会在另一个线程中自动关闭,在该线程中,串行通信正在进行 有人建议BackgroundWorker,但我不清楚 我还得到一个建议:“使用winform,将其FormBorderStyle设

我需要解决一个问题,需要一些输入。当我按下
按钮1
时,我的gui启动串行通信。我发送一些命令并接收一些数据。按下
按钮1
后,我在另一个线程(GUI线程除外)中停留3-4秒,直到数据完全传输。我想要的是当我按下
按钮1
时,在gui前面出现一个对话框、弹出窗口或类似的东西(显示一条繁忙的消息),当传输整个数据时,该弹出窗口会在另一个线程中自动关闭,在该线程中,串行通信正在进行

有人建议
BackgroundWorker
,但我不清楚

我还得到一个建议:“使用winform,将其FormBorderStyle设置为FixedDialog。将其设置为消息框一样小,并在其上放置一个progressbar控件。您可以在线程处理开始时使用forms ShowDIalog,然后在结束时关闭。为了简单起见,可以将进度条样式设置为Continuous。”

考虑到我的场景,有什么好的解释或其他简单的方法吗?
我想让事情变得简单

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

以下是逻辑:

  • 当用户单击按钮1时,显示弹出框,提示内容
  • 同时,数据传输代码也应该在同一个线程中
  • 然后编写代码获取一个点,此时所有数据都将被传输&@该点使该对话框消失
如果您想要任何示例代码,那么也请发布您的书面代码,这样我就可以给出一个实用的代码来向您展示逻辑


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

后台工作人员确实是最好的选择。这里有一个非常彻底的正确方法。

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

.net 4: .net 3: 在这两种情况下,“等待”对话框只是一种形式,带有某种动画和消息来显示等待


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

谢谢您的回复。实际上,对于这一部分,我还没有任何代码。目前,我有一个简单的按钮,上面有一个相关的点击事件,我在其中启动串行通信。正如你所知,c#有一个串行通信的接收功能,这是一个单独的线程,这就是我想要关闭弹出窗口的地方。此外,你能详细说明你在这里指的是什么类型的“弹出框”(我不能使用messagebox,对吗?). 我需要做一个自定义弹出窗口还是什么?你也可以做你自己的服装控件,但在我看来,要做那种控件是很困难的。并且您可以明确地以这种方式使用messagebox:System.Windows.Forms.messagebox.Show(“我的消息在此”);确保System.Windows.Forms程序集引用了您的项目。感谢您的回复。一个问题,后台工作人员会影响我当前的实现吗?如果是,以什么方式?因为我希望尽可能少地修改我当前的代码,所以我会这样做。但是,您需要一种在后台处理内容的方法,因此任何后台工作人员都会影响您的实现。使用线程或任务查看另一个答案中发布的代码。后台工作人员将承担同样多的工作。
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();
}
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();
}