2014-02-11 3 views
1

API를 사용하여 직렬 버스에서 대화하는 C#의 오래된 크고 문서화되지 않은 프로그램을 수정하려고합니다.계속하려면 다른 코드 부분을 실행하십시오 (C#)

OnIndication 트리거 SendRepeatRequest를 계속 진행시킬 수있는 방법이 있습니까? 응답 시간이 크게 달라짐에 따라 Xms 대기 플래그가 폴링되지 않도록하고 싶습니다. 빠른 응답이 필요합니다.

//Pseudocode 
public void SendRepeatRequest(int X) 
{ 
    SendToAPI(); 
    // Wait until API responds, usually a few ms but can take 1-2min 
    // loop X times 
} 

//this is activated by the API response 
public void OnIndication() 
{ 
// Handle request from API... 
// Tell SendRepeatRequest to continue 
} 

이 작업 방법에 대한 의견이 있으십니까? 감사합니다.

+0

'OnIndication'은'SendRepeatRequest'와는 다른 스레드에서 실행됩니까? – wdosanjos

+0

그들은 내가 말할 수있는 한 같은 스레드에서 실행됩니다. – Fousk

+0

아마도 OnIndication에 플래그를 설정하고 SendRepeatRequest 대기 루프에서 해당 플래그를 테스트하기 만하면됩니다. – wdosanjos

답변

0

Task 라이브러리 (System.Threading.Tasks 네임 스페이스 아래의 .NET 4.0에 도입 된)를 살펴볼 수 있습니다. 이 작업을 매우 쉽게 처리 할 수있는 다양한 스레딩 작업이 있습니다.

다음 섹션이 도움이 될 것이라고 생각합니다.

public void OnIndication() 
{ 
Task doWork = new Task(() => 
    { 
     // Handle request 
    }); 

    Action<Task> onComplete = (task) => 
    {     
     SendRepeatRequest(X, args) 
    }; 

    doWork.Start(); 

    doWork.ContinueWith(onComplete, TaskScheduler.FromCurrentSynchronizationContext());      
} 
+0

이것은 OP에서 설명한 문제를 해결하는 것으로 보이지 않습니다. – Servy

+0

나는 이것이 효과가 있다고 생각하지 않지만 잘못된 생각 일 수 있습니다. 나는 다음과 같은 것을 생각하고 있었다 : 'public void SendRepeatRequest (int X) {SendToAPI(); resp_flag = 0; // flag == 1을 기다립니다. // 다음 요청 보내기} public void OnIndication() {// API에서 핸들 요청 ... 플래그 == 1; } 그러나 대기 기능을 피하십시오. ' – Fousk