"Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток". с Twitterizer
Я разрабатываю твиттер-клиент в WPF, и я хочу использовать фонового работника для обновления твита, но результаты этого сообщения об ошибке "Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток".
public NewTweet()
{
InitializeComponent();
this.MouseLeftButtonDown += (o, e) => DragMove();
worker.WorkerReportsProgress = true;
worker.DoWork += DoWork;
worker.RunWorkerCompleted += WorkerCompleted;
}
void DoWork(object sender, DoWorkEventArgs e)
{
TwitterResponse<TwitterStatus> tweetResponse = TwitterStatus.Update(token, txttweet.Text);
System.Threading.Thread.Sleep(5);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
worker.RunWorkerAsync();
}
Большое вам спасибо.
Ответы
Ответ 1
Вы получите эту ошибку, если попытаетесь обновить элементы интерфейса непосредственно из метода DoWork.
Чтобы сообщить о прогрессе, вы должны использовать метод BackgroundWorker.ReportProgress. Затем в своем пользовательском интерфейсе подпишитесь на событие BackgroundWorker.ProgressChanged. Это гарантирует, что обновление прогресса будет настроено на правильный поток. Вы не должны обновлять элементы пользовательского интерфейса непосредственно из DoWork.
Ответ 2
Это обычная проблема с началом работы с людьми. Всякий раз, когда вы обновляете элементы пользовательского интерфейса из потока, отличного от основного потока, вам необходимо использовать:
this.Dispatcher.Invoke((Action)(() =>
{
...// your code here.
}));
Вы также можете использовать control.Dispatcher.CheckAccess(), чтобы проверить, владеет ли текущий поток элементом управления. Если он действительно владеет, ваш код выглядит нормально. В противном случае используйте шаблон выше.