C#/WPF-我可以';t从后台工作人员更新UI
本文关键字:后台 工作人员 更新 UI WPF- 我可以 | 更新日期: 2023-09-27 18:25:58
我有一个代码,它使用Tweetsharp库从特定的Twitter帐户获取推文,创建自定义UserControl
的实例,并将推文文本发布到该UserControl
,然后将其添加到StackPanel
。
然而,我不得不收到很多tweet,在向StackPanel
添加用户控件时,应用程序似乎会冻结。我试过使用BackgroundWorker
,但直到现在我都不幸运。
我的代码:
private readonly BackgroundWorker worker = new BackgroundWorker();
// This ( UserControl ) is used in the MainWindow.xaml
private void UserControl_Loaded_1(object sender, RoutedEventArgs e)
{
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
int usrID;
var service = new TwitterService(ConsumerKey, ConsumerSecret);
service.AuthenticateWith(AccessToken, AccessTokenSecret);
ListTweetsOnUserTimelineOptions options = new ListTweetsOnUserTimelineOptions();
options.UserId = usrID;
options.IncludeRts = true;
options.Count = 10;
twitterStatuses = service.ListTweetsOnUserTimeline(options);
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
foreach (var item in twitterStatuses)
{
TweetViewer tweetViewer = new TweetViewer(); // A UserControl within another UserControl
tweetViewer.Tweet = item.Text;
tweetViewer.Username = "@stackoverflow";
tweetViewer.RealName = "Stack Overflow"
tweetViewer.Avatar = ImageSourcer(item.Author.ProfileImageUrl);
stackPanel.Children.Add(tweetViewer);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
我现在想做的是解决无法在BackgroundWorker
中执行worker_RunWorkerCompleted中包含的代码的问题,但每次我尝试使用BackgroundWorker
执行它时,它都会失败&给我的错误如下:
调用线程必须是STA,因为许多UI组件都需要它。
我还尝试使用STA System.Threading.Thread而不是BackgroundWorker,但没有成功!
我错过了什么?我真的是WPF的新手,我可能忽略了一些重要的事情。
您得到这个异常是因为您的后台工作程序使用了一个新线程,而这个线程与主UI线程不同。为了简化错误消息,即不能从另一个线程更改UI元素,它们是独立的。
这个答案将解决你的问题。
我也从@Marc Gravell 找到了这个答案
///...blah blah updating files
string newText = "abc"; // running on worker thread
this.Invoke((MethodInvoker)delegate {
someLabel.Text = newText; // runs on UI thread
});
///...blah blah more updating files