전에 이벤트 강제실행 관련 질문 다시 드립니다.

소스는 아래와 같습니다. 답변해주신 대로

m_RequestHandler .invoke(this, EventArgs.Empty)
혹은 NewRequestReceived.invoke(this, EventArgs.Empty);

하려는데 파라미터 쪽에서 오류가 나는 듯합니다.
일단 두 번째 인자 EventArgs.Empty는 자동 생성으로 잘 나오는데 밑줄이 그어지더군요 제가 인자 등을 잘못 연결한 거 같습니다.

아래와 같이 메서드를 만들어서
사용해 보려고 했는데 역시나 this, e에서 밑줄이 나오더라고요 ㅠㅠ

에러 메시지 보니깐
제네릭 파라미터와 매칭이 안되는 듯합니다… OnRecevied가 <,> 로 구성돼있어서 그런듯합니다.
그 파라 미터들을 강제로 넣어줘야 하나요?

protected virtual void OnDo(EventArgs e)
{
    m_RequestHandler.Invoke(this, e);
}

웹 개발상에서는 이벤트가 발생했다는 것은
마우스, 키보드 등의 변화를 감지했을 때 발생하는 것이잖아요.

여기 OnReceived 란 이벤트 함수는 델리 게이 터를 통해 이벤트에 등록을 했는데 어떻게 써 이벤트를
발생할 수가 있는 것인가요?

이 소켓 소스 관련해서 Server에서 Connection 함수 등에서
무한 루프를 돌면서 해당 OnReceived(?) 을 실행하는 것인가요?

소스

namespace AccAuthService.Controller
{
    public class ControllerServer: AppServer<NetworkSession, ControllerPacket>
    {
     // RequestHandler는 delegate 임
     private RequestHandler<TAppSession, TRequestInfo> m_RequestHandler; 

    public virtual event RequestHandler<TAppSession, TRequestInfo> NewRequestReceived
    {
        add { m_RequestHandler += value; }
        remove { m_RequestHandler -= value; }
    }
  }
}

namespace AccAuthService.Controller
{
    public class ControllerServer: AppServer<NetworkSession, ControllerPacket>
    {
      public ControllerServer()
            : base(new ControllerReceiveFilterFactory())
            this.NewRequestReceived += this.OnReceived;
        }

        private void OnReceived(NetworkSession session, ControllerPacket requestInfo)
        {
            try
            {
                if (requestInfo == null)
                {
                     session.Close(CloseReason.ProtocolError);
                }
                else
                {
                    IControllerService service = IOCContainer
                        .FindService<IControllerService>(requestInfo.TargetServiceName);

                    service.Receive(requestInfo, session);
                }
            }
            catch (Exception ee) ~~~
        }
   }
}
1개의 좋아요

음… 제가 감히 한말씀 올리다면…

C# 관련 기본 서적을 딱! 한 번만 정독하시면
지금껏 올리셨던 모든 문제가 다 해결될 것이라 생각합니다.

헤딩하면서 배워나가는 것도 좋지만 효율이 너무 떨어져요.

더군다나 이렇게 게시판에 질문하는 건
답변이 원하는 것보다 늦게 오기 때문에 더더욱 효율이 안 날 겁니다.
(게다가 너무 기본적인 사용법 수준의 질문들이라 답변 자체가 잘 안 달리는 것도 염두해야하죠. 그나마 여기니까 답변이 달리는 겁니다…-ㅅ-;;; )

제가 신입일 때를 기준으로 C# 기본 서적 딱 이틀만 정독하시면 이런 문제는 말끔히 해결될 거 같아요.
(제가 신입일 때는 CLR via C# 을 이틀만에 강제로 봐야 했지만… 쿨럭;;;; )

혹시 어떤 책을 봐야 하냐 하는 질문이 또 있을 까봐 책 제목까지 알려드립니다.

시작하세요! C# 9.0 프로그래밍
(책광고 아닙ㄴ…)

화이팅+ㅂ+/

7개의 좋아요

오류의 원인은 짐작하신 것이 맞습니다.

코드가 완전하지 않아 추측으로만 답변드리자면 아마 m_RequestHandler.invoke(this, EventArgs.Empty)EventArgs.Empty 대신에 인자 두 개를 받도록 되어 있을 것 같네요.
확실하지는 않지만 인자의 개수만 맞춰주면 될 것 같습니다.

3개의 좋아요

@니꼴라오 님. 저도 @Greg.Lee 님의 의견과 같습니다. 학습 -> 경험의 순환이 좀 더 배움에 효과적이거든요. 그리고 저도 동일한 책을 추천 드립니다.

그리고 앞전에도 말씀 드렸는데, 코드는

```csharp
코드를 이곳에 붙여넣기
```

하셔야 보기가 좋아져서 답변이 달릴 가능성이 높아집니다.

  1. 오류 나는 이유
  • 이벤트 인자 유형이 일치하지 않음. 아마 제가 앞전에 <,>로 가이드를 드렸나봅니다. 앞전의 기억으로는 이 두개의 인자는 제네릭 유형이였던 것 같습니다. 그것과 일치시켜야 합니다.
  • 제네릭 인자 유형을 정의하지 않음. 소스코드로 유추해볼 때 제네릭 사용법을 숙지해야 해독하고 사용하실 수 있을 것 같은데요, 제네릭을 선행 학습 하시고 몇번의 코딩으로 익숙해지신 후 전개하는게 좀 더 효율적일 것 같습니다.
    제네릭 인자를 딜리게이트에서 단독으로 사용할 수 없습니다. 클래스에 제네릭 인자를 동일하게 표현하거나 결정된 제네릭 인자 유형을 딜리게이트에 표현해야 합니다.
4개의 좋아요