2013-03-15 2 views
0

В моих приложениях WPF я добавил кусок кода в кнопке мыши, как показано ниже:Вызов потока не может получить доступ к этому объекту

private void btn_convert_Click(object sender, RoutedEventArgs e) 
{ 
    Thread t = new Thread(new ThreadStart(WorkerMethod)); 
    t.SetApartmentState(ApartmentState.MTA); 
    t.IsBackground = true; 
    t.Start(); 
} 

Внутрь моей WorkerMethod() метод У меня есть некоторый код, как в строку ниже:

btn_convert.Content = "Convert"; 

Когда он достигает этой строки, он выдает исключение, поскольку вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток.

Я не хочу использовать диспетчер, поскольку он зависает от UI .. Пользовательский интерфейс должен быть отзывчивым, поэтому я не выбрал Dispatcher invoke или BeginInvoke.

Просьба дать мне ваши ценные предложения.

+0

«Я не хочу использовать Dispatcher, как она замерзает UI» - если рабочий поток будет использовать 'Dispatcher' время от времени, пользовательский интерфейс будет отвечать , Я надеюсь, что ваш WorkerMethod не будет обновлять пакетный интерфейс. 'btn_convert.Content =" Convert "' заморозит пользовательский интерфейс за миллисекунду. – Dennis

+0

Вы можете вызывать асинхронную версию Dispatcher.BeginInvoke, а не Invoke – David

+0

Я думаю, что вы выполняете тяжелую работу в WorkerMethod не только с обновлением ui. Вы должны только обновлять интерфейс пользователя Dispatcher.Invoke. Я не понимаю, почему это должно создать проблему. –

ответ

7

Я не хочу использовать диспетчер, поскольку он зависает от UI .. Пользовательский интерфейс должен быть отзывчивым, поэтому я не выбираю Dispatcher invoke или BrginInvoke.

Это просто показывает, что вы плохо использовали диспетчер.

Вы должны получить доступ к пользовательскому интерфейсу из пользовательского интерфейса. Это вовсе не означает, что весь ваш WorkerMethod нужно запустить в потоке пользовательского интерфейса, но эта строка:

btn_convert.Content = "Convert"; 

определенно делает. Таким образом, вы можете захотеть сохранить свой текущий код для запуска потока (вам действительно нужно установить состояние квартиры, хотя), но изменить любой код, доступ к пользовательскому интерфейсу для использования диспетчера. Например:

Action setButtonContentAction =() => btn_convert.Content = "Convert"; 
Dispatcher.BeginInvoke(setButtonContentAction); 

В качестве альтернативы, в зависимости от того, что ваш WorkerThread делает - и если вы используете C# 5 - вы могли хотите использовать новые функции асинхронных. Это упростит работу UI в потоке пользовательского интерфейса, но это зависит от того, что еще происходит.

+0

Это чудеса для меня .. Большое спасибо. – Sangeetha

1

Изменения в пользовательском интерфейсе могут применяться только к основной теме. Вы можете проверить, если основной вызов резьбы необходимо:

if (btn_convert.InvokeRequired) 
{ 
    btn_convert.Invoke((MethodInvoker)(() => btn_convert.Content = "Convert")); 
} 
Смежные вопросы