2010-02-03 3 views
2

에 비동기 이벤트를 제한하여 프로그램의 다른 부분에서 사용되는 일부 계산을 수행하는 클래스를 만들었습니다. 이 클래스는 데이터베이스의 데이터를 필요로하므로 WCF-Service를 호출하여 데이터를 가져옵니다. 클래스의 구조는 다음과 같습니다 계산-클래스를 참조하고 CalculationFinished 이벤트에 가입 할 필요가내 C# -Silverlight-3-Application의 호출 객체

public class ConsumptionCalculation 
{ 
    // Declare the event to notify subscribers, that the calculation has finished 
    public delegate void HandlerConsumtionCalculationFinished(object sender, ConsumtionCalculationArgs args); 
    public event HandlerConsumtionCalculationFinished CalculationFinished; 

    public void Do(int id) 
    { 
    // call the WCF-Service 
    DataContainer.instance.dataSource.GetConsumtionInfoAsync(id); 
    } 

    void dataSource_GetConsumtionInfoCompleted(object sender, GetConsumtionInfoCompletedEventArgs e) 
    { 
    // Receive the result of the WCF-Service call 
    // do some calculation here and put the results in the variable 'args' 

    // Raise an event to notify listeners, that the calculation is finished 
    CalculationFinished(this, args); 
    } 
} 

개체를.

public class IUseTheCalculation 
{ 
    ConsumptionCalculation _calcObject; 

    public IUseTheCalculation() 
    { 
    _calcObject = new ConsumptionCalculation(); 
    _calcObject.CalculationFinished += new HandlerConsumptionCalculationFinished(CalculationFinishedEvent); 
    } 

    private void CalculationFinishedEvent(object sender, ConsumptionCalculationArgs args) 
    { 
    // use the calculation to display data or write it to a file or whatever 
    } 
} 

은 두 개 이상의 클래스 각각 자신의 ConsumptionCalculation-개체가있는 IUseTheCalculation 클래스처럼있다.

내 문제는 다음과 같다 : 나는 클래스 중 하나의 ConsumptionCalculation 객체의 마 - 메서드를 호출 할 때 , 어떤 ConsumptionCalculation 객체에 대한 참조가 모든 클래스는, 결과 CalculationFinished 이벤트를 받게됩니다. 모든 기존 ConsuptionCalculation- 개체가 WCF 서비스에서 dataSource_GetConsumtionInfoCompleted 이벤트를 받기 때문에 이것이라고 생각합니다. 그러나 이벤트를 수신하는 호출 객체 만 원합니다. 이런 종류의 문제에 대한 표준 접근법이 있다고 생각하지만 아직 이해할 수는 없습니다. 이 문제를 어떻게 해결하겠습니까? 사전에

감사합니다, 프랭크

+0

비동기 프록시를 직접 구현하지 않고 생성 한 이유가 무엇입니까? –

+0

죄송 합니다만, 귀하의 요점을 모르겠습니다. – Aaginor

답변

1

어디하거나 CalculationFinished 이벤트를 선언하는 방법 당신은 보이지 않았다. 그것이 정적이라면, 그것은 당신이 보는 행동을 설명 할 것입니다. 하지만 이미 확인했다고 가정합니다. 아마도 디버거에서는 문제의 객체를 검사하여 해당 객체가 실제로 다른 인스턴스인지 여부를 판단 할 수 있습니다.

다양한 발신자를 구별하기 위해 "id"필드를 사용할 수 있습니까? 그렇다면 추가 매개 변수를 추가하여 추가 할 수 있습니까? 이렇게하면 다른 클래스가 알림을받지 못하게되지만 모든 알림을 신속하게 확인하여 알림이 해당 클래스에 대한 것인지 아닌지를 빠르게 확인할 수 있습니다. 나에게 의심스러운 무엇

+0

위 코드에 선언문을 추가했습니다. 모든 계산 - 객체는 관련 클래스의 생성자에서 new-operator로 초기화됩니다. 호출자를 구별하는 ID (또는 더 나은 해시 값, 아마도?)는 내가 가진 아이디어 였지만 해결 방법과 같은 느낌이었고 더 나은 "최상의 방법"접근 방식이 있다면보고 싶었습니다. – Aaginor

+0

I 해시를 사용하는 것이 해결책이 될 것이라고 동의합니다. 그러나 이전에이 문제를 보지 못했고 올바르게 작동하는 것으로 보았 기 때문에 다른 사람들이 그것을 보지 못할 수도 있기 때문에 "모범 사례"를 찾지 못할 수도 있습니다. 따라서 버그 일 경우 해결해야 할 수도 있습니다. 포기하기 전에 디버거를 사용하여 개체의 다른 인스턴스를 실제로 처리하고 있는지 확인할 수 있습니다. 그렇지 않은 경우 조사하여 문제가 무엇인지 알 수 있습니다., 어떤 객체가 당신이 다른 것으로 기대되는 것과 같으며, 선언 된 곳을 볼 것 등). –

+0

싱글 톤 개체를 사용하여 WCF 서비스에 액세스했기 때문에 문제가 발생했습니다. 서비스에 액세스하는 각 클래스가 자체 Service-Client를 가져 오면 모든 것이 잘 동작합니다. – Aaginor

1

은 다음과 같습니다

public void Do(int id) 
    { 
     // call the WCF-Service 
     DataContainer.instance.dataSource.GetConsumtionInfoAsync(id); 
    } 

어떻게 DataContainer.instance.dataSource 그 ConsumptionCalculation 인스턴스와 해당 ID를 연결했다되고있다? 이런 생성자에서 끝내고 있습니까?

public ConsumptionCalculation() 
{ 
    DataContainer.instance.dataSource.OnGetConsumptionInfoComplete += CalculationFinishedEvent; 
} 

은 어떻게 든 DataContainer.instance 및 ConsumptionCalculation의 각 인스턴스 사이에 만들어지고 연결이, 그리고 난 당신이 하나의 이벤트에 대한 모든 하나 하나를 연결하는 내기.

+0

WCF 서비스에 연결/액세스하기 위해 단일 (Singleton) 개체가 필요했습니다. 해당 ID를 제거하고 서비스에 액세스해야하는 각 클래스에 대한 Service-Client의 인스턴스를 만든 후에 모든 것이 예상대로 작동합니다. – Aaginor