gpt4 book ai didi

C#/WPF - 我无法从后台 worker 更新 UI

转载 作者:行者123 更新时间:2023-11-30 20:55:50 24 4
gpt4 key购买 nike

我有一个代码,它使用 Tweetsharp 库从特定的 Twitter 帐户获取推文,创建自定义 UserControl 的实例并将推文文本发布到该 UserControl 然后将其添加到 StackPanel

但是,我必须收到很多推文,而且在将用户控件添加到 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);
}

}

我现在想做的是解决BackgroundWorkerworker_RunWorkerCompleted中包含的代码无法执行但每次尝试执行的问题使用 BackgroundWorker 它失败并给我这样的错误:

The calling thread must be STA, because many UI components require this.

我也尝试过使用 STA System.Threading.Thread 而不是 BackgroundWorker,但没有成功!

我错过了什么?我是 WPF 的新手,我可能忽略了一些重要的事情。

最佳答案

你得到这个异常是因为你的后台 worker 使用了一个新线程,这个线程不同于主 UI 线程。为了简化错误消息说你不能从另一个线程更改你的 UI 元素,它们是独立的。

answer将解决您的问题。

我也找到了这个answer来自@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

关于C#/WPF - 我无法从后台 worker 更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18030759/

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