2009-12-15 6 views
1

나는 직렬 포트 통신 응용 프로그램을 개발 중입니다. 나는 수업을 썼다. 직렬 포트의 DataReceived 이벤트에서 일부 문자열 작업을 수행하는 메소드를 호출해야합니다. 다른 스레드에서 이러한 작업을하고 싶습니다.클래스에서 메서드 호출

하지만 내 응용 프로그램은 응용 프로그램의 창 (클래스 전용)이 아니기 때문에 Invoke() 메서드가 없습니다.

그래서 Invoke() 메소드가없는 클래스에서 메소드를 호출 할 수 있습니까?

감사합니다.

답변

0

System.Threading.Thread 클래스를 사용하고 대리자를 통해 메서드를 전달합니다.

편집 : 내가 제대로 비동기 메소드를 호출 할 것인지 이해

class Myclass 
{ 

System.Threading.Thread t1 = new System.Threading.Thread(new ThreadStart(mymethod)); 

public void mymethod() 
{ 
// do something here 
} 

public void ExecuteMyThread() 
{ 
t1.Start(); 
} 

} 

class MainClass 
{ 
Myclass mycl = new Myclass(); 

public static void Main(string args) 
{ 
// start my thread from other class 
mycl.ExecuteMyThread(); 
} 
+0

좀 더 설명 할 수 있습니까? 감사 – UnforgivenX

4

건가요? 그렇다면 : myCallBack 대리자가 object을 먹고 void을 반환

Thread.QueueUserWorkItem(myCallBack) 

. 간단한 예제가있는 MSDN을 참조하십시오.

0

새 스레드를 직접 작성하고 실행할 수 있습니다

Thread thread = new Thread(MyBackgroundMethod); 

thread.Start(); 

...

public void MyBackgroundMethod() 
{ 
... 
} 
2

당신은 UI를 처리하지 않기 때문에, 당신은 동기화 Invoke를 사용할 필요가 없습니다. ThreadPool, BackgroundWorker 또는 새 Thread을 사용하여 새 스레드를 생성 할 수 있습니다. 은 다른 스레드에서도 액세스 할 수있는 해당 스레드 액세스 데이터의 경우 동기화 메커니즘 (예 : lock 또는 유사)을 적용해야합니다.

간단한 예 :

// code in your class that reads data from serial port 
string data = GetDataFromSerialPort(); 
ThreadPool.QueueUserWorkItem(DoSomeProcessing, data);  

private static void DoSomeProcessing(object state) 
{ 
    string data = state.ToString(); 
    // process data 
} 
0

가장 쉬운 방법은 네임 스페이스 System.ComponentModel.BackgroundWorker에있는 BackgroundWorker를 사용하는 것입니다. 백그라운드 스레드에서 비동기 작업을 쉽게 관리 할 수있게하고 작업자 스레드가 완료되면 처리기를 취소하고 진행 상황을 모니터하고 응답하도록 처리기를 추가 할 수 있습니다. 다음은 MSDN의 링크입니다 link text

관련 문제