Ho riscontrato un problema interessante nell'applicazione C# .Net 4.0 utilizzando la classe SerialPort
e ThreadPool.QueueUserWorkItem
o Task
s..Net Thread vs ThreadPool vs Task per comunicazione SerialPort
Il problema si verifica solo se utilizzo 2 o più SerialPort contemporaneamente. Ogni porta seriale viene eseguito nel proprio filo che creo in 1 di 3 modi:
new Thread(DoSerialCommX)
ThreadPool.QueueUserWorkItem(DoSerialCommX)
new Task(DoSerialCommX, TaskCreationOptions.LongRunning).Start()
per illustrare il problema, ho creato il mio metodo DoSerialCommX
a leggere e scrivere sulla porta seriale per sempre in un ciclo. Assomiglia a questo: (Non lo faccio in realtà nel mio vero programma, questo è solo un frammento del mio programma di test che isola e illustra il problema).
private void DoSerialCommX()
{
SerialPort port = new SerialPort("ComX", 9600);
port.Open();
while(true)
{
//Read and write to serial port
}
}
Se utilizzo il metodo 2 o 3, la comunicazione seriale si interrompe e ricevo molti timeout di comunicazione. Se uso il metodo 1, tutto è buono. Inoltre, dovrei menzionare questo sembra solo si verifica sui miei PC basati su Intel Atom. I PC desktop sembrano non avere problemi.
So che il pool di thread riutilizza i thread e per impostazione predefinita Task
utilizza il pool di thread. E so che il pool di thread intendeva davvero operazioni di breve durata. Ma ho provato ad usare il TaskCreationOptions.LongRunning
, che pensavo avrebbe generato un thread dedicato piuttosto che usare il pool di thread, ma ancora non funzionava.
Quindi la domanda: Che cosa rende così speciale Thread
in questa situazione? C'è qualcosa di Thread
che lo rende più adatto alle operazioni di I/O?
Edit: Le risposte finora sembrano dare per scontato che io sto cercando di utilizzare il ThreadPool o Attività per un processo senza fine. Nella mia vera applicazione questo non è il caso. Sto solo usando un ciclo infinito nel codice qui sopra per illustrare il problema. Ho davvero bisogno di sapere perché Thread
funziona e ThreadPool
e Task
no. Che cosa è tecnicamente diverso da loro che potrebbe causare il singhiozzo della comunicazione seriale?
Suppongo sia una domanda stupida, ma non stai cercando di gestire> = 25 thread, vero? – Jeff
@ JeffN825, no, c'è solo 1 thread per porta seriale e sto usando al massimo 4 porte seriali. – Verax
1 e 3 sono uguali. –