首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为了停止UI线程的执行,messageBox.Show()做了什么?

为了停止UI线程的执行,messageBox.Show()做了什么?
EN

Stack Overflow用户
提问于 2019-08-22 09:58:37
回答 1查看 705关注 0票数 0

在WPF应用程序中,我将消息输出到文本框,并在这些消息之间调用一个设置仪器的函数。但是,所有消息都同时出现(函数调用结束时)。

我真的不知道如何清楚地解释我的问题。我试试..。我有一个WPF应用程序,它使用串口从仪器中获取数据。应用程序包含一些按钮和一个输出消息的文本框。按下按钮后,应用程序向仪器发送一个命令,以更改某些参数(通过函数Set_COMM_MODE())并返回。这个变化大约需要5-10秒。因此,我所做的是:在呼叫之前输出一条“请等待”消息,在呼叫返回后输出一条“完成”消息。代码中的OuputText()函数只调用TextBox.AppendText()方法。我的问题是:在调用返回时,所有输出文本都会被拆分到文本框上。我想请等一下..。然后5-10秒后,一条“完成”的消息。但这一切都同时出现了。但是,当我在第一条消息之后(函数调用之前)放置一个MessageBox时,消息会出现在textbox输出(调用函数的w/o)上。但是,问题是,为了继续,我必须在MessageBox上按OK键。

问(1):我如何才能使后一种情况发生时不得不求助于MessageBox

问(2):MessageBox是如何创建这种行为的?

我试过:使用Dispatch.Invoke()方法在另一个线程上运行OutputText。这(Pause a window like MessageBox.Show())是一个类似于我的问题,但似乎没有得到一个明确的答案,我没有很好地理解解决方案。

代码语言:javascript
复制
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()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-22 12:45:41

正如我在我的评论中所写的,您实际上应该只对UI使用(main) UI线程。在工作线程上执行任何其他长期运行的非UI操作。

您可能不会介意“挂起”UI 10秒,但用户肯定会生气。此外,阻止UI线程将导致Windows认为您的应用程序被冻结,所以您将得到一个很好的“没有响应”的徽章和所有相关的东西。这不仅看上去很糟糕,而且还会引起各种副作用。

您应该环顾四周,看看.NET为您提供了什么样的解决此类问题的方法。

听着,这是你的工作流程:

  1. 打印消息
  2. 启动初始化
  3. ???
  4. 初始化完成->打印“完成”
  5. 起动操作

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

.NET为您提供了很多工具,例如APM (异步编程模型)。但是,实现异步处理的最简洁、最强大的方法是基于抽头任务的异步编程模式,更被称为async/await

听着,您的问题可以通过以下几行来解决:

代码语言:javascript
复制
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就是其中之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57606723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档