2010-06-01 3 views
5

호출하는 동안 델리게이트에 null 매개 변수를 전달하려고하면 null 예외가 발생합니다. 문제는 라인null 매개 변수를 사용하여 대리자를 호출하는 방법은 무엇입니까?

 
     public void RequestPhoto() 
     { 
      WCF.Service.BeginGetUserPhoto(Contact.UserID, 
       new AsyncCallback(RequestPhotoCB), null); 
     } 

     public void RequestPhotoCB(IAsyncResult result) 
     { 
      var photo = WCF.Service.EndGetUserPhoto(result); 
      UpdatePhoto(photo); 
     } 

     public delegate void UpdatePhotoDelegate(Binary photo); 
     public void UpdatePhoto(Binary photo) 
     { 
      if (InvokeRequired) 
      { 
       var d = new UpdatePhotoDelegate(UpdatePhoto); 
       Invoke(d, new object[] { photo }); 
      } 
      else 
      { 
       var ms = new MemoryStream(photo.ToArray()); 
       var bmp = new Bitmap(ms); 
       pbPhoto.BackgroundImage = bmp; 
      } 
     } 

됩니다 : 다음은 코드가 어떻게 생겼는지의

변수 "사진"null의
 
Invoke(d, new object[] { photo }); 

합니다. 호출하는 동안 null 매개 변수를 전달하는 올바른 방법은 무엇입니까? 감사합니다.

+2

아마도 사진이 null이 아닌 경우에만 UpdatePhoto 메서드를 호출하면됩니까 ?? 나는 그것이 null 일 때 왜 호출해야하는지 알지 못합니다 ... –

+0

@Tony, 답장을 보내 주셔서 감사합니다. 그렇습니다. 그러나 나는 아직도 이것을하기위한 최선의 방법을 알고 싶다. 내 프로그램 전체에서 비동기 호출을 사용하기 시작 했으므로 null을 전달해야하는 다른 시나리오에서이 호출이 다시 발생합니다. 아이디어가 있다면 지금 알려주세요. –

+0

fyi. 나는 다음을 시도했지만 그것도 작동하지 않았다 : var d = new UpdatePhotoDelegate (UpdatePhoto); var parm = 새 개체 [1]; parm [0] = 사진; Invoke (d, parm); –

답변

1

타사의 이익을 위해서만 델리게이트에 null 인수를 전달할 수 있습니다 (유형이 허용하는 경우 여기에 설명이 필요함). 귀하의 경우에는 IAsyncResult가 허용합니다.

디버깅의 경우 특정 스레드 A에서 디버깅 중이므로 예외가 발생합니다. 예외는 스레드 B에서 발생합니다. 여러 스레드를 중단 할 수 있습니다. 스레드 B 코드를 중단하고 소스에 가까운 예외를 볼 수 있습니다.

여러 스레드에서 동시에 코드를 실행하는 경우 디버거가 돌아 다니는 것을 볼 수 있습니다. 여러 스레드에서 디버깅하는 것은 항상 조금 까다 롭지 만 문제를 해결할 때는 만족 스럽습니다. 이 스레드에 독립적 인 논리에 그대로

또한 또한,이 InvokeRequired을 확인하기 전에 널 (null)을 확인하는 응답 코드를 향상시킬 수 (코드는 호출 후, 그냥 사용 전에 확인). 이렇게하면 Invoke를 메시지 펌프로 푸시하는 시간을 절약 할 수 있습니다 (WinForms라고 가정).

0

바이너리가 null 가능 유형입니까? 나는 그것이 확실하지 않습니다 .... 당신은 nullable Binary를 대신 전달해야 할 수도 있습니다.

+0

예, nullable 형식 (System.Data.Linq.Binary)이라고 생각합니다. var photo = WCF.Service.EndGetUserPhoto (result); 예외가 없으면 사진이 없으면 null을 반환합니다. –

0

나는 그것을 알아 냈다. 문제는 내가 생각한 것처럼 델리게이트에 null 매개 변수를 전달하는 것과는 다릅니다. 문제는 라인에 널 예외를 발생시킨 실행 대리자로했다 :

 
var ms = new MemoryStream(photo.ToArray()); 

나는 그것이 호출 라인에 충돌했기 때문에 문제가 몰랐어요.

 
public void UpdatePhoto(Binary photo) 
     { 
      if (InvokeRequired) 
      { 
       var d = new UpdatePhotoDelegate(UpdatePhoto); 
       Invoke(d, new object[] { photo}); 
      } 
      else 
      { 
       if (photo != null) 
       { 
        var ms = new MemoryStream(photo.ToArray()); 
        var bmp = new Bitmap(ms); 
        pbPhoto.BackgroundImage = bmp; 
       } 
      } 
     } 

를 그리고 모두가 잘 다음과 같이

그래서 나는 UpdatePhoto 방법을 변경!

+1

다음 번에 Invoke를 사용하여 문제가 발생하면 InnerException을 확인하는 것을 잊지 마십시오. 문제가 좀더 빨리 해결되어야합니다! –

관련 문제