"Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток". с 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(), чтобы проверить, владеет ли текущий поток элементом управления. Если он действительно владеет, ваш код выглядит нормально. В противном случае используйте шаблон выше.