gpt4 book ai didi

c# - MVVM WPF BackgroundWorker 和 UI 更新

转载 作者:太空狗 更新时间:2023-10-30 01:33:57 25 4
gpt4 key购买 nike

我正在使用 wpf 学习 MVVM 模式,我正在尝试创建一个简单的启动画面来加载应用程序。

我有一个名为 Loading 的简单类,它有两个绑定(bind)到我的接口(interface)的属性。

public class Loading : INotifyPropertyChanged
{
/// <summary>
/// Define current status value from 0 to 100.
/// </summary>
private int _currentStatus;

/// <summary>
/// Define current status text.
/// </summary>
private string _textStatus;

/// <summary>
/// Define constructor.
/// </summary>
public Loading(int status, string statusText)
{
_currentStatus = status;
_textStatus = statusText;
}

public int CurrentStatus
{
get { return _currentStatus; }
set
{
_currentStatus = value;
OnPropertyChanged("CurrentStatus");
}
}

public string TextStatus
{
get { return _textStatus; }

set
{
_textStatus = value;
OnPropertyChanged("TextStatus");
}
}

#region Interfaces

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

#endregion
}

从我的 ctor ViewModel 我实例化了这个模型

Loading = new Loading(0, "Loading...");

并运行一个调用函数 GetSystemInfo() 的新线程,该线程执行一些操作以加载一些信息。

Thread systemInfo = new Thread(GetSystemInfo);
systemInfo.IsBackground = true;
systemInfo.Start();

我正在使用 GetSystemInfo() 更新用户界面

Loading.TextStatus = "Loading User Information...";
Loading.CurrentStatus = 50;

到目前为止一切顺利..线程正在正确更新用户界面,但问题是我希望在加载完成时关闭此启动画面并打开一个新窗口,但我无法检查线程是否完成或至少我没有找到这样做的方法。

有什么办法可以解决这个问题吗?

谢谢。

最佳答案

使用 Task 可以很容易地实现这一点类(通过 Task Parallel Library )与 async-await 的组合.

当您在 Taskawait 时发生的事情是控制权返回给调用者。在您的情况下,调用者来自 UI 线程,因此控件将返回到 UI 消息循环,使您的应用程序保持响应。线程完成工作后,它将返回到 await 之后的下一行,然后您可以在此处打开启动画面。

它看起来像这样:

public async void MyEventHandler(object sender, EventArgs e)
{
await Task.Run(() => GetSystemInfo());
// Here, you're back on the UI thread.
// You can open a splash screen.
}

关于c# - MVVM WPF BackgroundWorker 和 UI 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32222797/

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