2013-07-25 2 views
0

다른 스레드에서 Form 메서드를 호출하려고합니다. 양식 클래스에서 내가 가진 :여러 인수로 호출하여 FormatException이 발생합니다.

delegate int ReplaceMessageCallback(string msg, int key); 

public int ReplaceMessage(string msg, int key) 
{ 
    if (this.InvokeRequired) 
    { 
     ReplaceMessageCallback amc = new ReplaceMessageCallback(ReplaceMessage); 
     object[] o = new object[] { msg, key }; 
     return (int)this.Invoke(amc, o); 
    } 
    bool found = false; 
    int rv; 

    lock (this) 
    { 
     if (key != 0) 
     { 
      found = RemoveMessage(key); 
     } 
     if (found) 
     { 
      rv = AddMessage(msg, key); 
     } 
     else 
     { 
      rv = AddMessage(msg); 
     } 
    } 

    MainForm.EventLogInstance.WriteEntry((found) 
         ? EventLogEntryType.Information 
         : EventLogEntryType.Warning, 
      IntEventLogIdent.MessageFormReplace1, 
      String.Format("MessageForm::ReplaceMessage(({2},{0}) returns {1}.\n\n(The message {3} exist to be replaced.)", 
       key, 
       rv, 
       msg, 
       (found) 
        ? "did" 
        : "did not")); 
    return rv; 
} 

내가 이것을 실행하면, 나는 예외 "(0부터) 지수"FormatException을가 처리되지 않은했다 "의 크기보다보다 크거나 같은 제로와 작아야를 얻을 수 인수 목록. " 호출에 대한 호출.

기본적으로이 동일한 코드 조각은 단일 매개 변수 만 사용하는 클래스 메서드에서 제대로 작동하므로 개체 배열에 문제가 있다고 가정합니다.하지만 무엇이 있는지 전혀 모릅니다.

+0

'key' 변수를 사용하는 코드를 게시 할 수 있습니까? – keyboardP

+1

글쎄. "Invoke"가 나머지 함수에서 오류를 따라 가려는 것이 결코 내게 발생하지 않았습니다. 그러나 그것이 오류가있는 곳입니다. fubar 인 이벤트 로그에 Format이 있습니다. 묻는 것에 대해 감사합니다. .. 그것은 나를 더 한층 보게했다. 문제 해결됨. – Walt

+0

아무런 문제가 없다. 나는 그 오류가 주로'String.Format' 호출 (색인 생략)을 보았다. 그것을 수락 할 답변으로 수정 내용을 게시하십시오. – keyboardP

답변

1

이 처리하는 쉬운 방법은 다음과 같습니다

if (this.InvokeRequired) 
{ 
    int rslt; 
    this.Invoke((MethodInvoker) delegate 
    { 
     rslt = ReplaceMessage(msg, key); 
    } 
    return rslt; 
} 
0

IT는 호출 호출이 호출하는 함수 내에서 예외를 전달할 것이라고 밝혀, 당신은 그것으로 (디버거에서 F11)을 단계 수 없습니다. 나는 호출 된 코드로 넘어갈 것이라고 생각했기 때문에 실패했을 때 실제 Invoke 호출이라고 생각했다.

나는 함수의 본문에서 String.Format을 엉망으로 만들었고 Invoke는 코드에서 실제로 문제가 발생했음을 알리는 표시없이 그 예외를 전달했습니다.

관련 문제