gpt4 book ai didi

c# - 如何在繁忙的过程中快速处理事件,有Update命令吗?

转载 作者:行者123 更新时间:2023-12-02 00:35:33 24 4
gpt4 key购买 nike

在漫长(大约 1 分钟)的过程中,我尝试通过将带时间戳的消息写入文本控件来记录一些进度。但所有消息都会同时出现。显然,所有 PropertyChanged 事件 都会排队,直到我繁忙的进程完成,并立即由文本控件接收。我怎样才能在繁忙的过程中“刷新”事件?我进行了搜索,但找不到用于立即处理排队事件的刷新/更新/调度调用。

多线程解决方案位于 question 1194620 ,但我首先想尽可能避免多线程。在较旧的环境(C++、.Net Winforms/ASP)中,总是有诸如 Update 之类的系统调用来中断繁忙的进程来处理挂起的事件。

编辑:请不要告诉我一个冗长的过程应该在另一个线程中。我同意。但这是继承的代码,在我考虑转换为多线程之前,我首先需要记录某些事件以了解它的作用。此外,这个应用程序还有许多其他问题需要首先解决。而且,问题解决后,这个漫长的过程可能就不再漫长了。

我在 question 18888937 中找到的从任何地方编写字符串的方法并且工作正常。

这是隐藏代码。编辑:我在接受的答案中添加了对解决方案的调用。

public partial class App : Application, INotifyPropertyChanged
{
/// <summary>
/// Property for the log message for the TextBlock control
/// </summary>
public string StartupMessage
{
get { return _StartupMessage; }
set
{
if (_StartupMessage.Length == 0)
{
_StartupMessage = string.Format("{0:HH-mm-ss} {1}",
DateTime.Now, value);
}
else
{
_StartupMessage = string.Format("{0}{1}{2:HH-mm-ss} {3}",
_StartupMessage, Environment.NewLine, DateTime.Now, value);
}
OnPropertyChanged("StartupMessage");
}
}
private string _StartupMessage = "";

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
DoEvents();//see the accepted answer below
}
}

这是文本控件:

<TextBlock x:Name="textblock_StartupMessages" 
Margin="10" TextWrapping="Wrap"
Text="{Binding Path=StartupMessage, Source={x:Static Application.Current}}">
</TextBlock>

这是我如何在代码中放置来自其他位置的消息:

public class AllRoutesViewModel : ViewModelBase
{
public AllRoutesViewModel()
{
(System.Windows.Application.Current as App).StartupMessage =
"start of AllRoutesViewModel()";

最佳答案

avoid multithreading if possible. In older environments (C++, .Net Winforms/ASP) there were always system calls like Update to interrupt a busy process to handle pending events.

这是在系统上尝试一种设计模式,该系统的设计的行为与您提到的系统不同。

不应在 WPF 中的 GUI 线程上执行长时间运行的操作。

通知属性更改仅在 GUI 线程未被阻止时才起作用,因为它本质上是 GUI 进程。您拥有的代码正在阻塞 GUI 线程。如果您正确在后台工作程序或异步任务中运行任务并正确更新您的属性,则通知将使 GUI 在视觉上按照您实际想要和期望的方式运行。

但是根据您呈现的设计,以图形方式做到这一点是不可能的。最好的答案是学习 WPF 设计模式并遵循它,而不是强制采用不同的技术设计模式。

关于c# - 如何在繁忙的过程中快速处理事件,有Update命令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25687795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com