2014-03-25 4 views
0

이이 질문에 관련이있다 : 그것은 또한 입력 매개 변수를 지원 할 수 있어야 제외 How to create custom message pump?매개 변수를 지원하는 사용자 지정 메시지 펌프를 추가하는 방법은 무엇입니까?

나는 기본적으로 동일한 메시지 펌프가 필요합니다. 위 질문의 대답은 매개 변수를 허용하지 않는 Action() 대리자 만 지원합니다. 내 행동에 매개 변수를 전달할 수 있기를 원합니다. 매개 변수없는 버전은 다음과 같습니다.

public class MessagePump 
{ 
    private BlockingCollection<Action> actions = new BlockingCollection<Action>(); 

    public void Run() //you may want to restrict this so that only one caller from one thread is running messages 
    { 
     foreach (var action in actions.GetConsumingEnumerable()) 
      action(); 
    } 

    public void AddWork(Action action) 
    { 
     actions.Add(action); 
    } 

    public void Stop() 
    { 
     actions.CompleteAdding(); 
    } 
} 

올바른 방법은 무엇입니까? 내가 BlockingCollection 대신 액션의 사용자 정의 클래스를 저장 만들기에 대해 생각했다, 다음과 같을 것이다,의는 ActionWithParameter이라고 가정 해 봅시다 :

class ActionWithParameter 
{ 
    Action action; 
    object parameter; 
} 

그러나 그것은 단지 투박한 것, 플러스를 가져올 때 나는 또한 약간의 스위치 문이 필요합니다 조치 (매개 변수)를 호출 할 수 있도록 매개 변수가 어떤 유형인지 파악하는 조치. 또한 여러 매개 변수를 지원하려면 어떻게해야합니까? 그럼 object[] parameters을 사용해야합니까? 확실히 더 나은 해결책이 있습니까?

답변

1

대리자 스레드에서 해결책을 찾았 How to store delegates in a List

나는 기능과 다음과 같은 구문 :

actions.Add(new Action(() => MyFunction(myParameter))); 

를 사용하여 동작 유형의 인수를 모두 저장할 수

이것은 또한 내 문제를 해결 여러 매개 변수.