Здравствуйте,
Помогите разобраться с многопоточностью не самому профессиональному программисту.
Есть внешний источник посылающий данные в формате string name/string line. Нужно принимать и обрабатывать эти данные с максимально возможным быстродействием.
Попытка применить что-то вроде
switch (name)
{
case "a":
Thread tA = new Thread(GetA);
tA.Start(line);
break;
case "b":
Thread tB = new Thread(GetB);
tB.Start(line);
break;
}
с последующей обработкой в Get... работает неадекватно.
Посоветуйте, пожалуйста, в какую сторону нужно смотреть.
Это глобальный, можно сказать вопрос.
Но в процессе моих войн с многопоточностью образовался и еще один, маленький.
Можно ли исправить такой вот код
static void Main(string[] args)
{
for (int i = 1; i<=10; i++)
{
string line = i.ToString();
Thread t = new Thread(Go);
t.Start(line);
t.Join();
}
Console.ReadLine();
}
static void Go(object o)
{
Thread.Sleep(5000);
Console.WriteLine((string)o);
}
чтобы он напечатал цифры в правильной последовательности меньше, чем за 5*10 секунд?
Заранее спасибо.
Здравствуйте, abb269, Вы писали:
A>Здравствуйте,
A>Помогите разобраться с многопоточностью не самому профессиональному программисту.
A>Есть внешний источник посылающий данные в формате string name/string line. Нужно принимать и обрабатывать эти данные с максимально возможным быстродействием.
A>Попытка применить что-то вроде
A>A> switch (name)
A> {
A> case "a":
A> Thread tA = new Thread(GetA);
A> tA.Start(line);
A> break;
A> case "b":
A> Thread tB = new Thread(GetB);
A> tB.Start(line);
A> break;
A> }
A>
A>с последующей обработкой в Get... работает неадекватно.
A>Посоветуйте, пожалуйста, в какую сторону нужно смотреть.
A>Это глобальный, можно сказать вопрос.
A>Но в процессе моих войн с многопоточностью образовался и еще один, маленький.
A>Можно ли исправить такой вот код
Если нужна эффективность то лучше бы использовать Task Parallel Lubrary ...
хотя нужно знать сколько запросов за единицу времени поступает и как долго выполняется обработка
A>A> static void Main(string[] args)
A> {
A> for (int i = 1; i<=10; i++)
A> {
A> string line = i.ToString();
A> Thread t = new Thread(Go);
A> t.Start(line);
A> t.Join();
A> }
A> Console.ReadLine();
A> }
A> static void Go(object o)
A> {
A> Thread.Sleep(5000);
A> Console.WriteLine((string)o);
A> }
A>
A>чтобы он напечатал цифры в правильной последовательности меньше, чем за 5*10 секунд?
Join блокирует текущий поток пока t не завершит работу, следует вызывать Join вне тела цикла (например, сохранять потоки в списке и потом пробегаться по нему)
A>Заранее спасибо.