异常“类型的对象'System.Object []'无法转换为类型”

时间:2012-01-12 14:58:25

标签: c# wpf exception-handling

我是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 个答案:

答案 0 :(得分:3)

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

你使用了错误的重载方法。

你正在使用 invoke(priority,delegate,object) - 但是有一个对象数组。

如果你想传递一个对象数组 - 交换你的优先级并委托,就像这样:

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

您正在使用的重载是期望一个Object,而不是Object []

来源: http://msdn.microsoft.com/en-us/library/ms591596.aspxhttp://msdn.microsoft.com/en-us/library/cc647499.aspx

答案 1 :(得分:2)

Dispatcher.Invoke overloads有点奇怪。有一个参数重载,以及一个多参数重载,它接受来自其余参数的params数组的单独参数中的第一个参数。使用“message”作为第三个参数,而不将其包装在数组中。