2013-08-03 4 views
2

내가 Tweetsharp 라이브러리를 사용하여 특정 트위터 계정의 트윗을 가져 오는 코드가 그 UserControl에 사용자 정의 UserControl 및 사후 트윗 텍스트의 인스턴스를 생성 한 후 추가 StackPanel.의 C#/WPF는 - 내가 BackgroundWorker에에서 UI를 업데이트 할 수 없습니다

그러나 나는 많은 트윗을 가져야하고 사용자 컨트롤을 추가하는 동안 응용 프로그램은 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하지만 시도 할 때마다 사용하여 수행 할 수 많은 UI 구성 요소이 필요하기 때문에, 호출 스레드는 STA해야

하십시오 BackgroundWorker는 & 날 같은 오류를 제공합니다 실패합니다.

나는 또한 BackgroundWorker에의하지만 운이없는 대신 STA System.Threading.Thread를 사용하여 시도!

무엇이 누락 되었습니까? 저는 WPF에 대해 처음 접했고 중요한 것을 무시할 수 있습니다.

+0

인가? – ali

+0

'BackgroundWorker' 설정 방법을 보여줄 수 있습니까? 어떤 줄에 예외가 있습니까? – YK1

+0

@ali ** BackgroundWorker **와 관련된 모든 것은 _MainWindow_ 클래스 내에서 사용되는 다른 사용자 정의 사용자 정의 컨트롤에 있습니다. –

답변

4

백그라운드 작업자가 새 스레드를 사용하고이 스레드가 기본 UI 스레드와 다르기 때문에이 예외가 발생합니다. UI 요소를 다른 스레드에서 변경할 수 없다는 오류 메시지를 단순화하기 위해이 스레드는 독립적입니다.

answer은 문제를 해결합니다.

가 나는 또한 @Marc Gravell에서이 answer을 발견

MainWindow를 클래스에 배경 작업자 방법
///...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 
+1

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx의 참고 사항에 따르면 새로운 스레드에서 실행되는 것은 DoWork 처리기뿐입니다. –

+0

@glautrou 작동하지만, 'worker_RunWorkerCompleted'에서 수행하는 것과 동일합니다. UI는 모든 것이 완료 될 때까지 멈 춥니 다. –

+0

@AlaaJoseph : '작동 중'이면 - worker_RunWorkerCompleted에서 수행하는 것과 어떻게 동일한가요? 당신은'worker_RunWorkerCompleted'에 예외가 있다고 말했습니다 !! – YK1