柚子快報(bào)邀請(qǐng)碼778899分享:wpf線程中更新UI的4種方式
柚子快報(bào)邀請(qǐng)碼778899分享:wpf線程中更新UI的4種方式
? ? ? ? 在wpf中,更新UI上面的數(shù)據(jù),那是必經(jīng)之路,搞不好,就是死鎖,或者沒反應(yīng),很多時(shí)候,都是嵌套的非常深導(dǎo)致的。但是更新UI的方式,有很多的種,不同的方式,表示的意思不一樣,但是眼睛看到的,似乎是一回事。
首先我們創(chuàng)建一個(gè)簡(jiǎn)單的wpf程序
業(yè)務(wù)就是,一直點(diǎn)擊確定,然后更新數(shù)據(jù)即可,比較簡(jiǎn)單,通過簡(jiǎn)單的案例來了解一個(gè)wpf中更新UI的4種方法。?
第一種:
點(diǎn)擊確定后,界面先變化Hello WPF11,再變化Hello WPF12,并且界面可以任意拖動(dòng)不卡。
這個(gè)方法是全局性質(zhì)的。
using System.Windows;
namespace WpfApp6Demo
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void btnLogin_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() =>
{
// 耗時(shí)操作
Thread.Sleep(2000);
UpdateTextBlock("Hello WPF11");
});
await Task.Run(() =>
{
// 耗時(shí)操作
Thread.Sleep(2000);
UpdateTextBlock("Hello WPF12");
});
}
private void UpdateTextBlock(string text)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
txtUsername.Text = text;
}));
}
}
}
第二種:
點(diǎn)擊確定后,和前面的效果是一樣的。
這個(gè)方法是當(dāng)前界面性質(zhì)的。
using System.Windows;
namespace WpfApp6Demo
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void btnLogin_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() =>
{
// 耗時(shí)操作
Thread.Sleep(2000);
UpdateTextBlock("Hello WPF11");
});
await Task.Run(() =>
{
// 耗時(shí)操作
Thread.Sleep(2000);
UpdateTextBlock("Hello WPF12");
});
}
private void UpdateTextBlock(string text)
{
//System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
//{
// txtUsername.Text = text;
//}));
this.Dispatcher.Invoke(new Action(() =>
{
txtUsername.Text = text;
}));
}
}
}
第三種:
點(diǎn)擊確定后,和前面的效果是一樣的。
這個(gè)方法是當(dāng)前控件性質(zhì)的。
using System.Windows;
namespace WpfApp6Demo
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void btnLogin_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() =>
{
// 耗時(shí)操作
Thread.Sleep(2000);
UpdateTextBlock("Hello WPF11");
});
await Task.Run(() =>
{
// 耗時(shí)操作
Thread.Sleep(2000);
UpdateTextBlock("Hello WPF12");
});
}
private void UpdateTextBlock(string text)
{
//System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
//{
// txtUsername.Text = text;
//}));
//this.Dispatcher.Invoke(new Action(() =>
// {
// txtUsername.Text = text;
// }));
txtUsername.Dispatcher.Invoke(new Action(() =>
{
txtUsername.Text = text;
}));
}
}
}
第四種:?
點(diǎn)擊確定后,和前面的效果是一樣的。
這個(gè)方法是當(dāng)前控件性質(zhì)的,但是還對(duì)當(dāng)前控件進(jìn)行是否有訪問權(quán)限進(jìn)行了判斷。
using System.Windows;
namespace WpfApp6Demo
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void btnLogin_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() =>
{
// 耗時(shí)操作
Thread.Sleep(2000);
UpdateTextBlock("Hello WPF11");
});
await Task.Run(() =>
{
// 耗時(shí)操作
Thread.Sleep(2000);
UpdateTextBlock("Hello WPF12");
});
}
private void UpdateTextBlock(string text)
{
//System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
//{
// txtUsername.Text = text;
//}));
//this.Dispatcher.Invoke(new Action(() =>
// {
// txtUsername.Text = text;
// }));
//txtUsername.Dispatcher.Invoke(new Action(() =>
//{
// txtUsername.Text = text;
//}));
if (!txtUsername.Dispatcher.CheckAccess())
{
txtUsername.Dispatcher.Invoke(new Action
}
else
{
txtUsername.Text = text;
}
}
}
}
以上都是以同步Invoke的方式進(jìn)行調(diào)用的,異步的話使用BeginInvoke。?
總結(jié):通過案例,可以了解到,上面4種方式,對(duì)于此案例來說都可以達(dá)到最終的效果,但是那一種效果最好,并沒有體現(xiàn)出來。博主認(rèn)為:第三種最好,原因是從這個(gè)需求上考慮的,因?yàn)樾枨笮枰碌木褪莟xtUsername上面的數(shù)據(jù),那么直接作用于它,對(duì)于資源的耗損,將是最少得??赡苡腥苏J(rèn)為第四種方式最好,進(jìn)行了線程判斷,似乎更加的安全,那么您認(rèn)為呢???
本文來源:
wpf線程中更新UI的4種方式-CSDN博客
柚子快報(bào)邀請(qǐng)碼778899分享:wpf線程中更新UI的4種方式
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。