2009-08-28 5 views
0

모든 WaitOne 및 ManualResetEvent 작업이 작동합니다 (감사합니다!) 스레드에서 클래스 A의 함수를 실행하는 마지막 문제가 있습니다. 클래스 B의 일부인 - 다시 설명 할 수있게 해주세요 ...클래스 B의 스레드에서 클래스 A의 함수 호출 [C#]

클래스 A에서 "DoIt (obejct param)"함수를 살펴보면 클래스 A에서 (그림과 같이) 호출해야하며 클래스 B의 스레드 (그림 참조) ... 어떻게이 작업을 수행 할 수 있습니까? 일부 대표단이 도움이 될까요?

class A 
{ 
private ManualResetEvent manualResetEvent; 
int counter = 0; 

public A() 
    { 
    manualResetEvent = new ManualResetEvent(false); 
    B child = new B(manualResetEvent); 

    if (manualResetEvent.WaitOne(1000, false)) 
     { 
     ... do the work I was waiting on ... 
     } 

    ... do more work ... 
    // Call the function DoIt from within A // 
    DoIt(param) 

    } 

    // This is the function that needs to be called from A and thread in B 
    void DoIt(object param) 
    { 
    counter++; 
    ... do something with param with is local to A ... 
    } 

}; 


Class B 
{ 
private ManualResetEvent manualResetEvent; 

public B(ManualResetEvent mre) 
    { 
    manualResetEvent = mre; 
    Thread childThread = new Thread(new ThreadStart(Manage)); 
    childThread.IsBackground = true; 
    childThread.Name = "NamedPipe Manager"; 
    childThread.Start(); 

    private void Manage() 
     { 
     ... do some work ... 
     ... call some functions ... 

     // Calling the function from Class A, obviouslly doesn't work as-is 
     DoIt(param); 

     manualResetEvent.Set(); 

     ... do more work ... 
     ... call more functions ... 
     } 
    } 
}; 

이 작업을 스레드로부터 안전하게 수행 할 수있는 방법에 대한 제안이 있습니까? 도움을 주시면 감사하겠습니다. 감사합니다,

답변

1

현재 디자인 간단한 일이 당신은으로 ManualResetEvent와 일을 같이 한 개체 B에 전달하는 것입니다 감안할 때 : 물론

B child = new B(this, manualResetEvent); 
... etc... 

Class B 
{ 
private A parent; 
private ManualResetEvent manualResetEvent; 

public B(A p, ManualResetEvent mre) 
{ 
    parent = p; 
    manualResetEvent = mre; 
    ... etc ... 


private void Manage() 
{ 
    ... do some work ... 
    ... call some functions ... 

    parent.DoIt(param); 

    ... etc... 

당신은 public으로 A.DoIt을 표시해야합니다.

+0

"this"를 전달하고 parent.manualResetEvent를 대신 사용하는 것이 좋지 않겠습니까? 아마도 – Shaitan00

+0

. 그러나 당신이 좋은 디자인에 관심이 있다면 아마도 그 작은 일뿐만 아니라 전체를 다시 평가해야합니다. – DSO

0

이전 질문과 마찬가지로, 당신은 B의 생성자에게 메서드를 호출하려는 인스턴스를 전달해야합니다.

+0

나는이 코드가 지나치게 코딩 된 것입니다.하지만 ... 5-10 스레드 (클래스 B의 인스턴스)를 사용할 수 있기 때문에 byref가 아닌 byref가 수행되기를 바랍니다. 이것은 스레드 안전하다고 간주됩니다 ? 2 명의 자녀 (B 클래스)가 동시에 A.DoIt (...)을 호출하면 어떻게됩니까? – Shaitan00

+0

코드는 한 번에 하나씩 만 호출 할 수 있습니다. 작업에서 무엇을하는지 정확히 알지 못하면 코드가 스레드로부터 안전하지 않은 이유를 알기가 어렵습니다. –

+0

FUNCTION을 잠글 수 있습니까? 또는 DoIt을 사용할 때 잠금 (부모) 자체를 의미합니까? – Shaitan00

0

클래스 A와 클래스 B 모두를 조작하는 상위 클래스가 있어야한다고 가정합니다. GUI 양식이나 주 스레드와 같은?

작업을 수행해야 할 때 트리거되는 클래스 B에 대해 이벤트가 정의 될 수 있습니다. 양식이 이벤트를 수신하면 A 클래스의 함수를 호출하십시오.

두 클래스가 서로에 크게 의존하는 것처럼 들립니다. B에서의 작업이 A의 결과에 의존하고 그 반대 인 경우, 모듈러 클래스가 실제로 얼마나 재검토를 원할 수 있습니다.

+0

이 서비스는 상위 클래스 (서비스 인터페이스)이지만 GUI가 없습니다 (컨트롤 없음). – Shaitan00

관련 문제