2012-01-12 5 views
-1

Я новичок в C#. У меня проблема при обновлении текстового поля в WPF из потока, который выполняется в другом классе.Исключение «Объект типа» System.Object [] 'не может быть преобразован в тип «

Мое исключение:

Объект типа 'System.Object []' не может быть преобразован в тип

Вот мой код в виде:

public void UpdateUserOnline(userOnlineClass message) 
{ 
    if(onLineTextbox.Dispatcher.CheckAccess()) 
    { 
     // The calling thread owns the dispatcher, and hence the UI element 
     for (int i = 0; i < message.user.Length; i++) 
     { 
      // this.Dispatcher.Invoke(Action) 
      onLineTextbox.AppendText("•" + message.user + "\r\n"); 
      onLineTextbox.AppendText(" ->" + message.status + "\r\n"); 
      // txtDestination.Items.Add(message.user[i]); 
     } 
    } 
    else 
    { 
     // Invokation required 
     onLineTextbox.Dispatcher.Invoke(DispatcherPriority.Normal,new UpdateUserOnlineCallback(UpdateUserOnline), new Object[] { message }); 
    } 
} 

И это моя часть кода из моего класса Thread:

thrMessaging = new Thread(new ThreadStart(ReceiveMessages)); 
thrMessaging.Start(); 

private void ReceiveMessages() 
{ 
    Response = null; 

    while (chatClient.Connected) 
    { 
     if (strm.DataAvailable) 
     { 
      Response = (commandClass)reciveFormatter.Deserialize(strm); 

      processMessage(Response); 
      //procProcessMessageCallback(processMessage), new object[] { Response }); 
      //ProcessMessageCallback proccess = new ProcessMessageCallback(processMessage(Response));  
     } 
    } 
}  

private void processMessage(commandClass message) 
{ 
    /* 
    if (message.money != null) 
    { 
     UpdateUserRanking((userRankingClass)message.money); 
    } 
    */ 
    if (message.online != null) 
    { 
     waitinglist.UpdateUserOnline((userOnlineClass)message.online); 
    } 
} 
+6

Что линия бросает исключение? – abatishchev

+3

Попробуйте отладить и выясните, какая строка вызывает проблему ... Я думаю, что ваше сообщение об ошибке неполное ... –

+0

@abatishchev здесь onLineTextbox.Dispatcher.Invoke (DispatcherPriority.Normal, новый UpdateUserOnlineCallback (UpdateUserOnline), новый объект [] { сообщение}); –

ответ

2

Dispatcher.Invoke overloads немного странно. Существует одна перегрузка аргументов и перегрузка нескольких аргументов, которая принимает первый аргумент в отдельном параметре из массива params оставшихся аргументов. Используйте «сообщение» в качестве третьего аргумента, не обернув его в массив.

+0

+1 для ссылки перегрузки 'Dispatcher.Invoke' – Rachel

3
onLineTextbox.Dispatcher.Invoke(
    DispatcherPriority.Normal, 
    new UpdateUserOnlineCallback(UpdateUserOnline), 
    new Object[] { message }); 

Вы используете неправильный метод перегрузки.

Вы используете invoke (приоритет, делегат, объект) - но с массивом объектов.

если вы хотите передать массив объектов - переставить приоритет и делегировать вокруг, например, так:

onLineTextbox.Dispatcher.Invoke(
    new UpdateUserOnlineCallback(UpdateUserOnline), 
    DispatcherPriority.Normal, 
    new Object[] { message }); 

перегрузки вы используете ожидает объекта, а не Object []

Источник: http://msdn.microsoft.com/en-us/library/ms591596.aspx и http://msdn.microsoft.com/en-us/library/cc647499.aspx

Смежные вопросы