Articles of multithreading

L’implementazione di Singleton è corretta e thread-safe?

Questa implementazione singleton è corretta e thread-safe? class Class { public static readonly Class Instance; static Class() { Instance = new Class(); } private Class() {} }

Notifica al termine del thread, senza bloccare il thread chiamante

Sto lavorando su un’applicazione legacy che è stata costruita su NET 3.5. Questo è un limite che non posso cambiare. Ho bisogno di eseguire un secondo thread per eseguire un’attività a lunga esecuzione senza bloccare l’interfaccia utente. Quando il thread è completo, in qualche modo ho bisogno di eseguire un callback. In questo momento ho […]

C’è un buon metodo in C # per lanciare un’eccezione su un dato thread

Il codice che voglio scrivere è come questo: void MethodOnThreadA() { for (;;) { // Do stuff if (ErrorConditionMet) ThrowOnThread(threadB, new MyException(…)); } } void MethodOnThreadB() { try { for (;;) { // Do stuff } } catch (MyException ex) { // Do the right thing for this exception. } } So che posso avere […]

Come cancellare una discussione?

Nel caso di BackgroundWorker , una cancellazione può essere segnalata dalla proprietà DoWork – del gestore di eventi DoWork . Come posso ottenere la stessa cosa con un object Thread ?

c # problema con Thread usando Invoke da un thread in background

Ho una discussione, che elabora un lavoro analitico. private static void ThreadProc(object obj) { var grid = (DataGridView)obj; foreach (DataGridViewRow row in grid.Rows) { if (Parser.GetPreparationByClientNameForSynonims(row.Cells[“Prep”].Value.ToString()) != null) UpdateGridSafe(grid,row.Index,1); Thread.Sleep(10); } } Voglio aggiornare in modo sicuro il mio gridView in loop, quindi uso il modo classico: private delegate void UpdateGridDelegate(DataGridView grid, int rowIdx, int […]

Quando esce un’applicazione di console multithread?

class Program { public static void Main(String[] args) { var c = new C(); var thread = new Thread(new ThreadStart(cF)); thread.Start(); Console.WriteLine(“Exiting main, but the program won’t quit yet…”); } } class C { public void F() { for (int i = 0; i < 10; i++) { Console.WriteLine("Waiting {0}", i); Thread.Sleep(1000); } Console.WriteLine("Now the […]

aggiornare l’interfaccia utente in Attività utilizzando TaskScheduler.FromCurrentSynchronizationContext

Voglio aggiungere del testo alla casella di riepilogo usando Task e io semplicemente uso un pulsante e posto nell’evento click questo codice: TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(() => { for (int i = 0; i < 10; i++) { listBox1.Items.Add("Number cities in problem = " + i.ToString()); System.Threading.Thread.Sleep(1000); } }, CancellationToken.None, TaskCreationOptions.None, uiScheduler); ma non […]

Application.Run (Form) vs. Form.Show ()?

Supponiamo che un sacco di cose stiano accadendo sul thread principale della GUI (stream di dati, azioni dell’utente, ecc.). Supponiamo che vorremmo creare un modulo e mostrarlo. Potrebbe esserci un aumento delle prestazioni se usiamo Application.Run(Form) in contrapposizione a Form.Show() ? C’è un modo migliore per farlo? Per favore spiega perché o perché no.

Come mostrare che il pattern a doppio check-lock con TryGetValue del dizionario non è protetto da thread

Recentemente ho visto alcuni progetti C # che utilizzano un pattern a doppio controllo su un Dictionary . Qualcosa come questo: private static readonly object _lock = new object(); private static volatile IDictionary _cache = new Dictionary(); public static object Create(string key) { object val; if (!_cache.TryGetValue(key, out val)) { lock (_lock) { if (!_cache.TryGetValue(key, […]

Strano comportamento quando non uso TaskCreationOptions.LongRunning

Ho un motore che ha un numero arbitrario di poller che fanno il loro “sondaggio” ogni pochi secondi. Voglio che i poller vengano eseguiti in thread diversi, ma ogni “polling” all’interno di un singolo poller dovrebbe essere sequenziale, in modo che si verifichi dopo il successivo. Tutto funziona utilizzando questo codice per avviare il processo […]