2010-08-23 174 views
0

我想要使用計時器每10秒掃描一次隊列。如果該隊列中有多於0個項目,則將第一個項目作爲Deque,將其作爲參數傳遞給Process並運行該進程。在執行此過程時應禁用計時器。一旦進程退出,它應該重新啓用計時器。進程隊列計時器

隊列中的項目可以手動添加或可以來自數據庫。

以下C#代碼在第一個進程完成後無法工作。由於某種原因,定時器不能再次啓用。有人可以幫忙嗎?

public MainForm() 
{ 
    InitializeComponent(); 

    queue = new Queue<string>(); 
    process = new Process(); 
    process.Exited += new EventHandler(Process_Exited); 
    process.EnableRaisingEvents = true; 
} 

void StartProcess(string args) 
{ 
    ProcessStartInfo psi = new ProcessStartInfo(); 
    psi.FileName = @"C:\Program Files\My Software\RunProcess.exe"; 
    psi.Arguments = args; 
    psi.WindowStyle = ProcessWindowStyle.Minimized; 

    process.StartInfo = psi; 
    process.Start(); 
} 

void Process_Exited(object sender, EventArgs e) 
{ 
    timer.Enabled = true; 
} 

void Timer_Tick(object sender, EventArgs e) 
{ 
    if (queue.Count > 0) 
    { 
     timer.Enabled = false; 
     StartProcess(queue.Dequeue()); 
    } 
} 

回答

1

我沒有查找缺乏時間的細節,但我發現調度timer.Enabled = true;到UI線程將做的伎倆。

編輯:剛剛檢查MSDN:「這個Windows計時器是爲單線程環境設計的,UI線程用於執行處理,它要求用戶代碼有一個可用的UI消息泵,並始終運行相同的螺紋,或封送呼叫到另一個線程「

0

考慮使用Process.WaitForExit(),而不是處理Exited事件。這樣,您可以設置超時值(以防過程永不退出),並且您可以在Timer_Tick()方法內啓動/停止計時器。

+0

該進程可以根據它必須處理的數據量運行可變的時間量。問題是它不能並行運行,這就是爲什麼我必須排隊。這個過程所花費的時間可以在30秒到3小時之間。在此期間,我的軟件也必須執行其他任務,所以不能使用WaitForExit()。 – 2010-08-23 07:56:07

0

不限運氣:

timer.AutoReset = TRUE;