2012-01-12 2 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), 새 Object [] { 메시지 }); –

답변

2

Dispatcher.Invoke overloads 조금 이상합니다. 단일 인수 오버로드와 여러 인수 오버로드가 있으며 나머지 인수의 params 배열과는 별도의 매개 변수에서 첫 번째 인수를 사용합니다. "메시지"를 배열로 래핑하지 않고 세 번째 인수로 사용하십시오.

+0

'Dispatcher.Invoke' 오버로드 링크 +1 – Rachel

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

잘못된 오버로드 방법을 사용하고 있습니다.

invoke (priority, delegate, object) -하지만 객체 배열을 사용하고 있습니다.

당신은 객체 배열을 전달하려면 - 당신의 우선 순위를 교환하고 주위에 위임과 같이 : 당신이 오히려 객체 []

보다 Object를 기대하고 사용하고

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

과부하 출처 : http://msdn.microsoft.com/en-us/library/ms591596.aspxhttp://msdn.microsoft.com/en-us/library/cc647499.aspx

관련 문제