Answer the question
In order to leave comments, you need to log in
How to start multiple threads in C# (SOLVED)?
I'm learning multithreading. Faced the following problem. Here is the code:
public class WORK{
private int number;
public Action<int> delegWork; // Обобщ.делегат
public void Working(int num){
this.number += num; // Какая-то полезная работа с результатов переданным в this.number
ThreadPool.QueueUserWorkItem((object n) => { this.delegWork((int)n); }, this.number ); //Запуск делегата
}
}
public class ANALYSIS{
private readonly Form _form; // Windows Form
public Action<int> delegAnalysis; // Обобщ.делегат
public ANALYSIS(Form form){
this._form = form;
this.Make();
}
// Метод класса, в котором происходит присвоение делегату анон.метода
private void Make(){
this.delegAnalysis += (number) => {
this._form.Invoke((MethodInvoker)delegate{
Thread.Sleep(25); // Эмуляция полезной работы
Console.WriteLine ("Number: " + number);
});
};
}
}
.....
/* В основном потоке */
WORK worker = new WORK();
ANALYSIS analyzer = new ANALYSIS(this); // В конструктор передаем текущий Windows Form приложения
worker.delegWork += (number) => { analyzer.delegAnalysis(number); };
//Цикл в основном потоке (например построчное чтение из файла и т.п.)
for(int i = 0; i < 500; i++){
worker.Working(i);
}
1
3
6
4
2
5
...
500
489
499
public class WORK{
private BlockingCollection<Func<Task>> _collection = new BlockingCollection<Func<Task>>();
private Thread ConsumerThread;
private int number;
public Action<int> delegWork; // Обобщ.делегат
//Конструктор
public WORK(){
this.ConsumerThread = new Thread(this.LaunchThread);
this.ConsumerThread.Start();
}
public void Working(int num){
this.number += num; // Какая-то полезная работа с результатов переданным в this.number
int index = this.number; this._collection.Add(new Func<Task>(async () => { this.delegWork(index); })); // Добавляем делегат во второй поток через BlockingCollection
}
// Метод для второго потока
private async void LaunchThread()
{
while (true)
{
var processTask = this._collection.Take();
await Task.Run(processTask);
}
}
}
public class ANALYSIS{
private readonly Form _form; // Windows Form
public Action<int> delegAnalysis; // Обобщ.делегат
public ANALYSIS(Form form){
this._form = form;
this.Make();
}
// Метод класса, в котором происходит присвоение делегату анон.метода
private void Make(){
this.delegAnalysis += (number) => {
this._form.Invoke((MethodInvoker)delegate{
Console.WriteLine ("Number in analyzer: " + number);
});
};
}
}
.....
/* В основном потоке */
WORK worker = new WORK();
ANALYSIS analyzer = new ANALYSIS(this); // В конструктор передаем текущий Windows Form приложения
//Подписываем делегат
worker.delegWork += (number) => { analyzer.delegAnalysis(number); };
worker.delegWork += (number) => { Console.WriteLine ("Number: " + number); };
//Второй поток для задачи (например построчное чтение из файла и т.п.)
new Thread(() =>
{
for(int i = 0; i < 500; i++){
worker.Working(i);
}
}).Start();
Answer the question
In order to leave comments, you need to log in
The question is - how can I make threads sequentially executed? For the next thread to wait until the previous one finishes its work. And preferably as less resource intensive as possible.
//Цикл в основном потоке
for(int i = 0; i < 500; i++) Console.WriteLine(i);
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question