2012-08-17 3 views
1

내가 x 초에서 함수, this 같은 그 무언가를 시작하는 방법을 알고 :매 x 초마다 여러 기능을 동시에 시작 하시겠습니까?

private Timer timer1; 
public void InitTimer() 
{ 
    timer1 = new Timer(); 
    timer1.Tick += new EventHandler(timer1_Tick); 
    timer1.Interval = 2000; // in miliseconds 
    timer1.Start(); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    function1(); 
    function2(); 
    function3(); 
} 

여기서 문제 : 기능을 동시에 실행할 수 없습니다. Function2Function1이 완료된 경우에만 실행할 수 있습니다. 그러나 나는 그들이 동시에 달리고 싶다. 그게 내가 할 수있는 이유 :

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Parallel.Invoke(
    () => Function1(), 
    () => Function2(), 
    () => Function3() 
    ); 
} 

이것이 C#에서 할 가장 현명한 방법인가요? Parallel.Invoke으로 이해할 수없는 것 : 타이머가 5 초로 설정되어 있고 5 초 후 function1,2,3이 완료되지 않았지만 모두 다시 호출하면 어떻게됩니까? 스레드에서 이러한 기능을 시작합니까? function1() (동시에)을 실행하는 x-threads를 호출 한 후 있습니까? 궁금증은 정말 건강합니다.

누군가가 더 많은 정보를 얻을하려는 경우 : function1는 그냥 거기에 B 폴더 A에서 X 파일을 복사하는 것입니다, function2은 폴더 B에서 모든 파일을 읽고 정보를 저장 만 존재하고 function3가를 확인 만이 연결이 있고 연결이있는 경우 해당 파일을 누군가에게 보냅니다.

코드에 대한 제안 사항은 무엇입니까? 고마워요

+0

parrallel 실행은 직렬 실행의 반대입니다. 첫 번째 예가 무엇이 잘못 되었습니까? – asawyer

+0

http://www.albahari.com/threading/threading.pdf –

+0

마지막 단락을 기반으로하여, 3과 같은 소리가 들리므로 파일을 병렬로 실행하고 싶지 않은 것 같습니다. 2는 파일 식별에 의존하고 2는 파일 이동에 따라 달라집니다. 정확합니까? – Omaha

답변

1

System.Threading.Timer을 사용하면 ThreadPool 스레드에서 콜백을 예약하므로 새 작업을 만들 필요가 없습니다. 또한 콜백의 겹침을 방지하기 위해 간격을 제어 할 수 있습니다.

// fired after 5 secs, but just once. 
_timer = new System.Threading.Timer(Callback, null, 5000, Timeout.Infinite); 

// on the callback you must re-schedule the next callback time; 
private void Callback(Object state) { 
    Function1(); 
    Function2(); 

    // schedule the next callback time 
    _timer.Change(5000, Timeout.Infinite); 
} 
0

작업을 보았습니까?

은 당신이 뭔가를 할 수 있습니다 :

Task[] tasks = new Task[3]; 
tasks[0] = Task.Factory.StartNew(() => Function1()); 
tasks[1] = Task.Factory.StartNew(() => Function2()); 
tasks[2] = Task.Factory.StartNew(() => Function3()); 
Task.WaitAll(tasks); 

은 위의 당신은 당신이 원하는 의미하는 것 인 병렬 기능을 실행할 수 있습니다.

timer1_Tick 모든 작업이 완료 될 때까지 기다리지 않으려면 WaitAll ....을 사용하지 마십시오. 대신 작업 완료시 작업 완료를 확인할 수 있습니다. 타이머가 다시 발생하면 .... 다음 번에 기능을 수행할지 여부를 결정합니다.

2

Parallel.Invoke는 모든 기능을 병렬로 실행합니다. function2가 function1보다 먼저 실행되면 안되기 때문에 백그라운드에서 실행하지만 순차적으로 실행하는 작업을 만듭니다.

Task.Factory.StartNew(() => 
{ 
    function1(); 
    function2(); 
    function3(); 
}); 

내 타이머가 5 초 동안 5 초 function1,2 후 설정되고 3 그들이 완료 여부에 관계없이 볼 수있는 bool을 사용할 수 있습니다

을 수행하지 않으면 무엇.

관련 문제