Я работал над настраиваемым многопоточным сервером, который использует HTTP для связи с клиентами.Для создания новых тем я использовал метод Task.Factory.StartNew ().Для синхронизации я использовал объекты ManualResetEvent.
Вот суть кода:
namespace ThreadTest {
class Program {
private readonly ManualResetEvent _event = new ManualResetEvent(false);
public void Start() {
for (int i = 0; i < 100; i++) {
int num = i;
Task.Factory.StartNew(() => {
Console.WriteLine("Task {0} Started", num);
_event.WaitOne();
});
}
}
static void Main(string[] args) {
var test = new Program();
test.Start();
Console.ReadLine();
}
}
}
В реальном коде объект _event
в конечном итоге вызвал бы Set
чтобы освободить ожидающие задачи.
Проблема, с которой я столкнулся, заключается в том, что этот код прекрасно работает на моей машине разработки (двухъядерной с двумя потоками на ядро и использующей среду выполнения MS .NET 4).), но не работает на моем сервере (который является одноядерным с 1 потоком на ядро и использует среду выполнения Mono 2.8).Вывод на моей машине разработки:
Task 0 Started
Task 1 Started
Task 3 Started
Task 2 Started
Task 4 Started
Task 5 Started
...
В то время как вывод сервера
Task 53 Started
Мой вопрос: что я неправильно понимаю в ManualResetEvent или Задачах?Почему TaskFactory продолжает выполнять задачи на двухъядерном, а не одноядерном?
Обновление:
Я только что попробовал это на моем двухъядерном (1 поток на ядро) ноутбук Mac, и я получил вывод
Task 97 Started
Task 1 Started
А потом ничего.Я также попробовал его с Mono на моей машине для разработки (4 потока) и получил:
Task 99 Started
Task 2 Started
Task 98 Started
Task 0 Started
Так что это похоже на ошибку с Mono.