ОК, поэтому, во-первых, создание нового потока имеет некоторые минимальные накладные расходы, но вы создаете поток только один раз (или несколько раз) ... так, если вы не создаетесотни потоков (что не должно быть), тогда вам не нужно беспокоиться о накладных расходах.
Давайте рассмотрим ваш первый пример:
Thread thread;
thread = new Thread(new ThreadStart(DoNetworkThing));
// you should set the thread to background, unless you
// want it to live on even after your application closes
thread.IsBackground = true;
thread.Start();
Если вы придерживалисьВ этой модели функция DoNetworkThing
будет выглядеть следующим образом:
void DoNetworkThing()
{
while(someConditionIsTrue)
{
// do the networking stuff here
}
}
Я предполагаю, что в вашей следующей попытке вы сделали что-то вроде этого:
Thread thread = new Thread(()=>
{
while(true)
{
DoNetworkThing();
}
});
thread.IsBackground = true;
thread.Start();
Оба подхода хороши, ноединственное отличие - содержание DoNetworkingThing
.Во втором подходе это будет выглядеть так:
void DoNetworkThing()
{
// do the networking thing, but note
// that this time your infinite while
// loop is outside the function
}
Теперь вы сказали, что обе эти попытки действительно медленны, но ничто из приведенных в ваших примерах не будет указывать на то, что должно быть какое-либо заметное снижение производительности.Было бы здорово, если бы вы могли:
- Приведите пример, демонстрирующий замедление.
- Расскажите, сколько ядер у вас на машине, на которой запущена игра.
Наконец, если вы смешиваетесь с потоками, я бы СИЛЬНО предложил вам взять хорошую книгу о многопоточности и действительно ознакомиться сконцепции, стоящие за этим, пройти упражнения и написать пару простых программ.Это займет у вас пару месяцев, но если вы не знакомы с многопоточностью, это поможет вам научиться избегать множества безобразных ошибок.
Многие люди рекомендуют Joe Duffy's ConcurrentПрограммируюсь в Windows , но не стесняйтесь проверять некоторые другие многопоточные книги по C # .