2015-11-07 8 views
6

Sono nuovo in C# e sto ancora imparando il concetto di threading. Ho scritto un programma che è la seguenteConcetto di filettatura in C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Threading; 

namespace ConsoleApplication17 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     System.Threading.ThreadStart th1 = new System.Threading.ThreadStart(prnt); 
     Thread th = new Thread(th1); 
     th.Start(); 
     bool t = th.IsAlive; 
     for (int i = 0; i < 10; i++) 
     { 
      Console.WriteLine(i + "A"); 
     } 
    } 

    private static void prnt() 
    { 
     for (int i = 0; i < 10; i ++) 
     { 
      Console.WriteLine(i + "B"); 
     } 
    } 
    } 
} 

Mi aspetto un output come: -

1A 
2A 
1B 
3A 
2B... 

in quanto ritengo che sia thread principale e filo di nuova creazione devono essere in esecuzione contemporaneamente.

Ma l'uscita è ordinata, prima viene chiamata la funzione prnt e quindi viene eseguito il metodo Main per il ciclo.

+3

Il tuo codice sembra buono; presumibilmente ci vuole più tempo perché il thread si avvii piuttosto che per il thread principale da completare. Aggiungi 'Thread.Sleep (500);' a ogni ciclo 'for'; questo ti aiuterà a fare in modo di impiegare più tempo per poter vedere cosa sta succedendo. – JohnLBevan

+1

La schedulazione dei thread non è prevedibile e molti programmi hanno esito negativo (condizioni di competizione) perché il programmatore ha assunto un comportamento ideale sui thread che non esistono, ad esempio supponendo che i thread vengano sempre eseguiti in parallelo e in perfetta sincronizzazione. Non lo fanno. Considera come il tuo programma gira su un processore a thread singolo con un sistema operativo con grandi time-slicing (100ms +). – Dai

risposta

3

forse un ciclo di 10 non è sufficiente per vedere i due thread in esecuzione contemporaneamente. utilizzare un ciclo più lungo o inserire un Thread.Sleep (100) all'interno dell'iterazione del ciclo. L'avvio di una discussione è piuttosto costoso. Quello che succede, probabilmente, è che il ciclo principale viene eseguito prima dell'inizio del ciclo di thread, a causa del tempo richiesto per l'avvio di un thread

+0

Grazie, ha funzionato con 100 iterazioni. – user2235487

2

Accetto le risposte precedenti è necessario aggiungere Thread.Sleep (alcuni secondi * 1000)

vi consiglio di leggere questo articolo su filo https://msdn.microsoft.com/ru-ru/library/system.threading.thread(v=vs.110).aspx

static void Main(string[] args) 
    { 
     Thread th = new Thread(prnt); 
     th.Start(); 
     for (int i = 0; i < 10; i++) 
     { 
      //sleep one second 
      Thread.Sleep(1000); 
      Console.WriteLine(i + "A"); 
     } 
     //join the basic thread and 'th' thread 
     th.Join(); 
    } 
    private static void prnt() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      //sleep one second 
      Thread.Sleep(1000); 
      Console.WriteLine(i + "B"); 
     } 
    } 
1

aggiornato: Un processo è utilizzato per isolare le applicazioni e le discussioni eseguito nel contesto di quel processo.

In questo modo, è più facile per il sistema operativo gestire diverse app, gestire i crash e il cambio di contesto (intervalli di tempo previsti per ogni app che deve essere eseguita dalla CPU). L'idea alla base è semplicemente eseguire i thread durante uno slot di tempo predefinito, quando il tempo concesso per l'esecuzione di un'app termina, la CPU passa all'altro thread da eseguire.

Utilizzare la classe di threading per piccole attività asincrone nelle applicazioni.

Vedere come nell'esempio seguente è possibile creare un nuovo thread utilizzando lo spazio dei nomi System.Threading. Si noti come t.Join() viene chiamato per attendere il completamento del nuovo thread.

Si noti che Spleep (1) si imporrà per modificare il contesto e questo è ciò che fa la differenza con l'esempio. Prova a riportarlo a zero e vedere i risultati.

using System; 
using System.Threading; 

namespace Chapter1 
{ 
    public static class Threads1 
    { 
     public static void ThreadMethod() 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       Console.WriteLine("ThreadProc: {0}", i); 
       Thread.Sleep(1); 
      } 
     } 
     public static void Main(string[] args) 
     { 
      Thread t = new Thread(new ThreadStart(ThreadMethod)); 
      t.Start(); 
      for (int i = 0; i < 4; i++) 
      { 
       Console.WriteLine("Main thread: Do some work."); 
       Thread.Sleep(1); 
      } 
      t.Join(); 

      Console.Read(); 
     } 
    } 
} 
// OUTPUT: 
//Main thread: Do some work. 
//ThreadProc: 0 
//ThreadProc: 1 
//Main thread: Do some work. 
//ThreadProc: 2 
//Main thread: Do some work. 
//ThreadProc: 3 
//Main thread: Do some work. 
//ThreadProc: 4 
//ThreadProc: 5 
//ThreadProc: 6 
//ThreadProc: 7 
//ThreadProc: 8 
//ThreadProc: 9 
+1

* Un "thread" viene utilizzato per isolare le applicazioni e lasciarle eseguire nel proprio processo. * No, un thread non è un processo e non isola una "applicazione". Un thread è un'unità di esecuzione che consente di eseguire più operazioni * in parallelo *. Un thread è ancora nel contesto logico di un processo. –

+0

Aggiornato @YuvalItzchakov – Rober