Исключение "Объект типа 'System.Object []' не может быть преобразован в тип" - PullRequest
0 голосов
/ 12 января 2012

Я новичок в C #. У меня проблема при обновлении текстового поля в WPF из потока, запущенного в другом классе.

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

Объект типа '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);
    }
}

Ответы [ 2 ]

3 голосов
/ 12 января 2012
onLineTextbox.Dispatcher.Invoke(
    DispatcherPriority.Normal,
    new UpdateUserOnlineCallback(UpdateUserOnline),
    new Object[] { message } );

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

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

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

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

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

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

2 голосов
/ 12 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...