C # / WPF - Não consigo atualizar a interface do usuário de um trabalhador de segundo plano
Eu tenho um código que busca tweets de uma conta específica do Twitter usandoTweetsharp biblioteca, cria instância de um personalizadoUserControl
e postar o texto do tweet para queUserControl
em seguida, adicione-o a umStackPanel
.
No entanto, eu tenho que ter um monte de tweets e parece que o aplicativo iria congelar ao adicionar controles de usuário para oStackPanel
. Eu tentei usarBackgroundWorker
, mas eu não tive sorte até agora.
Meu código:
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);
}
}
O que eu quero fazer agora é resolver o problema de não conseguir executar o código contidoworker_RunWorkerCompleted dentro de umBackgroundWorker
mas toda vez que eu tento executá-lo usando umBackgroundWorker
ele falha e me dá erros como:
O segmento de chamada deve ser STA, porque muitos componentes de interface do usuário exigem isso.
Eu tentei também usar umSTA System.Threading.Thread em vez do BackgroundWorker mas sem sorte!
O que estou perdendo ? Eu sou realmente novo no WPF e posso estar ignorando algo importante.