为了账号安全,请及时绑定邮箱和手机立即绑定

messageBox.Show() 执行什么操作才能停止 UI 线程的执行?

messageBox.Show() 执行什么操作才能停止 UI 线程的执行?

C#
不负相思意 2023-09-16 16:16:05
在 WPF 应用程序中,我将消息输出到文本框,并在这些消息之间调用一个设置仪器的函数。但是,这些消息都会同时出现(在函数调用结束时)。我真的不知道如何清楚地解释我的问题。我会尝试...我有一个 WPF 应用程序,它使用串行端口从仪器获取数据。该应用程序包含一些按钮和一个用于输出消息的文本框。按下按钮后,应用程序会向仪器发送命令以更改某些参数(通过函数Set_COMM_MODE()),然后返回。更改大约需要 5-10 秒。因此,我所做的是:在呼叫之前输出一条“请稍候”消息,在呼叫返回后输出一条“完成”消息。OuputText()代码中的函数只是调用方法TextBox.AppendText()。我的问题:呼叫返回时,所有输出文本都会在文本框中显示出来。我预计会出现“请稍候”...然后 5-10 秒后出现“完成”信息。但这一切都是同时出现的。但是,当我在第一条消息之后(在函数调用之前)放置 aMessageBox时,该消息将出现在文本框输出上(没有被调用的函数)。但问题是我必须按“确定”MessageBox才能继续。Q(1):如何让后者发生而不需要求助于MessageBoxQ(2):MessageBox为了创建这种行为,a 做了什么?我尝试过:使用该Dispatch.Invoke()方法在另一个线程上运行OutputText。这个(Pause a window like MessageBox.Show())与我遇到的问题类似,但似乎没有得到明确的答案,而且我也不太理解解决方案。void StartTest_btn_Click(object sender, RoutedEventArgs e){    OutputText("Please Wwait\r\n"); //<---- This should appear at once.    MessageBox.Show("Please Wwait"); //<--without this, both messages appear at same time after 10s.    Set_COMM_MODE("02"); //<--- This takes around 5-10s    OutputText("Done\r\n"); //<--- This should appear 5-10s later}我希望立即显示“请稍候” ,然后在函数返回后 5-10 秒后显示“完成”Set_COMM_MODE()消息。
查看完整描述

1 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

正如我在评论中所写,您实际上应该仅将(主)UI 线程用于 UI。在工作线程上执行任何其他长时间运行的非 UI 操作。

您可能不介意 UI“挂起”10 秒,但用户肯定会感到恼火。此外,阻止 UI 线程将导致 Windows 认为您的应用程序已冻结,因此您将获得漂亮的“无响应”徽章和所有相关内容。这不仅看起来很糟糕,而且还会导致各种副作用。

您确实应该环顾四周,看看 .NET 为此类问题提供了哪些解决方案。

看,这就是你的工作流程:

  1. 打印一条消息

  2. 开始初始化

  3. ???

  4. 初始化完成-->打印“done”

  5. 开始运行

这是什么?这是一个异步处理。您启动一个操作并异步继续 - 这意味着仅当该操作完成时。

.NET 为此提供了很多工具,例如 APM(异步编程模型)。但实现异步处理的最简洁、最强大的方法是 TAP - 基于任务的异步编程模式,更广为人知的名称是asyncawait

看,您的问题可以使用 TAP 通过几行代码来解决:

async void StartTest_btn_Click(object sender, RoutedEventArgs e)

{

    OutputText("Please Wait\r\n");      


    // Set_COMM_MODE will be executed on a worker thread!

    // The main (UI) thread won't block. It will continue.

    // But the StartTest_btn_Click method itself will pause until the task is finished.

    await Task.Run(() => Set_COMM_MODE("02"));


    // This line will only be executed, after the Set_COMM_MODE call is completed;

    // furthermore, it will be executed on the UI thread again!

    OutputText("Done\r\n");

}

您确实应该更多地了解现代编程技术,TAP 就是其中之一。


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信