在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())是一个类似于我的问题,但似乎没有得到一个明确的答案,我没有很好地理解解决方案。
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()。
发布于 2019-08-22 12:45:41
正如我在我的评论中所写的,您实际上应该只对UI使用(main) UI线程。在工作线程上执行任何其他长期运行的非UI操作。
您可能不会介意“挂起”UI 10秒,但用户肯定会生气。此外,阻止UI线程将导致Windows认为您的应用程序被冻结,所以您将得到一个很好的“没有响应”的徽章和所有相关的东西。这不仅看上去很糟糕,而且还会引起各种副作用。
您应该环顾四周,看看.NET为您提供了什么样的解决此类问题的方法。
听着,这是你的工作流程:
这是什么?这是一个异步处理。您启动一个操作并异步地继续--这意味着,只有当操作完成时。
.NET为您提供了很多工具,例如APM (异步编程模型)。但是,实现异步处理的最简洁、最强大的方法是基于抽头任务的异步编程模式,更被称为async/await。
听着,您的问题可以通过以下几行来解决:
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就是其中之一。
https://stackoverflow.com/questions/57606723
复制相似问题