Voglio aggiungere un altro punto alla risposta già buona di Danny Varod , incentrata sulla domanda nel tuo ultimo paragrafo .
Supponendo che tu gestisca gli eventi generati dal timer multimediale o da un altro timer ad alta risoluzione, ora devi inviare la tua pesante attività di elaborazione in un'altra discussione. Le librerie di .NET rendono questo relativamente facile usando la libreria Task Parallelism (TPL) se stai usando .NET 4.0, o usando direttamente il ThreadPool per le versioni precedenti.
Diciamo che hai questo codice (molto abbozzato):
private void ProcessImage(object imageToProcess)
{
// Do whatever. Process the image, save the results, etc.
// This is the 1-sec process.
}
private void myTimer_Elapsed()
{
Image capturedImage = myCamera.CaptureImage(); // or whatever.
Task.Factory.StartNew(ProcessImage, capturedImage);
}
Questo avvia una nuova attività (un wrapper attorno a un metodo asincrono) che viene avviata su un thread ThreadPool. Se la tua macchina ha più CPU e più core, il ThreadPool avrà molti thread disponibili e elaborerà molte di queste richieste in parallelo. Si spera che ciò consentirà alle attività di elaborazione di tenere il passo con le attività di acquisizione delle immagini. Potrebbe essere necessario leggere il threadpool e vedere come modificare i thread disponibili per le macchine con molte CPU, ma lo scenario peggiore è che le attività di elaborazione vengano ripristinate, ma il threadpool (che è il cuore della libreria di attività ) li accosteranno e li raggiungeranno alla fine.
Nota, comunque, che sei non garantito che le attività saranno eseguite nell'ordine in cui sono state acquisite.
Se utilizzi una versione precedente di C #, sostituisci la chiamata a Task.Factory.StartNew
con le chiamate a ThreadPool.QueueUserWorkItem
, che in questo caso (dove non stiamo utilizzando le continuazioni e la gestione aggregata degli errori) sarà praticamente identica utilizzo.