2011-11-25 4 views
1

작은 응용 프로그램 (C#, .Net4, 콘솔 응용 프로그램)을 시작했고 규칙을 기반으로 파일을 집에서 옮기는 기본 아이디어였습니다.메서드에서 업데이트 되돌리기

이 앱은 성장하여 매우 유용합니다. 그래서 저의 임무는 더 재사용 가능한 클래스와 더 작은 프로젝트 (클래스 라이브러리)로 나누는 것입니다.

문자열 및 error_level ID를 허용하는 일반 '표시'기능이 있습니다. 이를 바탕으로 텍스트를 콘솔 창에 특정 색상으로 출력합니다. 하나의 큰 클래스에서 모두 괜찮 으면 좋겠지 만 메서드를 자신의 클래스 libabry로 옮기고 싶습니다. 그러나 처리하는 동안 업데이트를 내 UI (콘솔 창, 지금은)에보고하고 싶습니다. 내가 그것을 수업으로 옮길 때, 분명히, 나의 '쇼'방법 '에 대한 수업이 중단된다.

클래스 메서드에서 보낸 메시지를 내 UI로 다시 가져올 수있는 방법이 있습니까? 그것은 '열린 구성 파일', '12 개의 새 파일 처리', '성공'과 같은 메시지입니다.

그리고 UI가 메시지를 가져 와서 표시하며, 메서드는 작업을 완료합니다.

현재 콘솔 앱 프로젝트입니다. 필자의 계획은 작동 코드를 추출하고 테스트 용 콘솔 응용 프로그램을 유지 한 다음 'UI'를 멋진 WPF 데스크톱 응용 프로그램으로 변경하는 것입니다. (나는 WPF를 배우려고 노력 중이며, 나이가 들기 시작한 작은 프로젝트를 사용하기로 결정했으며 'skin it').

답변

2

인터페이스를 추가하고 해당 인터페이스를 UI에 구현하고 새 클래스에 인터페이스를 구현하는 클래스에 대한 참조를 전달하는 것이 좋습니다.

이 방법은 단일 스레드 또는 다중 스레드로 작업을 수행하는 경우에 효과적입니다. 예를 들어

인터페이스 :

public interface INotify 
{ 
    void Notify(string Msg); 
} 

인터페이스 :

public class Form1 : INotify 
{ 
     // This is the method where you instantiate the new worker process 
     public void DoSomeWork() { 
      NewClass Worker = New NewClass(this); 
     } 

     public delegate void NotifyDelegate(string Msg); 

    public void Notify(string Msg) 
    { 
     txtLog.Text += Msg + Environment.NewLine; 
    } 

    void INotify.Notify(string Msg) 
    { 
     this.INotify_Notify(Msg); 
    } 
    private void INotify_Notify(string Msg) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new NotifyDelegate(Notify), Msg); 
     } 
     else 
     { 
      this.Notify(Msg); 
     } 
    } 
    } 

새로운 클래스 (다만 메시지가 보내이 클래스의 통지를 호출)

public class NewClass 
{ 
    private INotify m_Notifier; 

    private void Notify(string Msg) 
    { 
     m_Notifier.Notify(Msg); 
    } 

    public NewClass(INotify oNotifier) 
    { 
     m_Notifier = oNotifier; 
    } 
} 

대체 구현으로 업데이트

정적 클래스와 함께 사용할 수있는 대체 구현은 대리자를 구현하는 것입니다.

static class Program 
{ 
    private static NotifyDelegate m_Notifier; 
    static void Main(string[] args) 
    { 
     m_Notifier = new NotifyDelegate(Notify); 

     NewClass oNewClass = new NewClass(m_Notifier); 

     // Your work code here 
    } 
    static void Notify(string Msg) 
    { 
     Console.WriteLine(Msg); 
    } 
} 

및 작업 클래스의 수정 된 버전 :

public class NewClass 
{ 
    private NotifyDelegate m_Notifier; 

    public void Notify(string Msg) 
    { 
     m_Notifier.Invoke(Msg); 
    } 

    public NewClass(NotifyDelegate oNotifier) 
    { 
     m_Notifier = oNotifier; 
    } 
} 
다음
public delegate void NotifyDelegate(string Msg); 

는 콘솔 응용 프로그램의 샘플 정적 인 클래스입니다 :

예를 들어

, 여기에 위임입니다

+0

고마워, 나는 이것을 시도하고있다. 그러나 현재 나의 앱은 콘솔 앱이므로 내 메인 프로그램 클래스는 정적이다. Notify 메서드를 선언하면 내 프로그램에서 정적이어야합니다. public static void Notify (String message, Constants.ErrorLevel errorLevel) 입니다. 인터페이스는 다음과 같이 선언됩니다. void Notify (string message, Constants.ErrorLevel errorLevel); 그래서 하나는 정적이고 다른 하나는 그렇지 않기 때문에 UI에 Notify가 Implimented되지 않았다는 오류가 표시됩니다. 어떻게해야합니까? – Craig

+0

상황을 처리하기 위해 인터페이스 대신 대리자를 사용하도록 답변을 업데이트했습니다. –

+0

고마워요 - 비 정적 클래스로 이동하면서 WPF를 얻었을 때 인터페이스 기반 솔루션을 사용하는 것이 좋을지 또는 이벤트 처리기가 정적 및 비 정적 기반 프로젝트 모두에 적합한 솔루션이 될까요? ? – Craig

1

일반적으로 Binding을 사용하면 viewModel을 뷰에 바인딩하고 viewModel에 대한 모든 변경 사항이 UI에 직접 표시됩니다.

2

질문을 올바르게 이해하면 UI가 일종의 상태 인 event을 구독 할 수 있도록 이벤트 처리를 구현할 것입니다. 대안은 NLog와 같은 일종의 로깅 프레임 워크를 사용하고 methodCall target을 통해 UI의 정적 메서드에 로그하는 것입니다. WPF를 사용하고 있으므로 MVVM을 사용하는 것이 좋습니다. 이것은 아마도 강력하고 관리하기 쉬운 UI를 만드는 가장 좋은 방법 일 것입니다.

1

UI 스레드의 클래스가 수신 대기중인 event 클래스를 가져올 수 있습니까? 'worker'클래스는 매개 변수가있는 이벤트를 발생시키고, 리스너 클래스는 해당 정보를 UI에 씁니다.