Имею такую часть кода в функции
CallbacksRequest req = null;
if (!requests.ContainsKey(forCity))
{
Console.WriteLine("Not сontains {0}", forCity.City);
req = new CallbacksRequest() { forCity = forCity };
req.callbackProcesses.Add(OperationContext.Current.GetCallbackChannel<IWeatherCallback>());
requests.Add(forCity, req);
Thread t = new Thread(new ThreadStart(CheckUpdate(forCity)));
t.IsBackground = true;
t.Start();
}
else Console.WriteLine("Contains {0}", forCity.City);
req = (CallbacksRequest)requests[forCity];
Проблема в том, что если requests не имеет ключ forCity, то выполняется всё что в if-е и не идет дальше. Хотя там запуск нового потока происходит как фоновый.
В чем может быть проблема?Насколько я понимаю фоновый поток не должен останавливать основной. Может проблема в том что в фоновом потоке в функции CheckUpdate(forCity) используется бесконечный цикл. Или может проблема в том что это WCF.
CheckUpdate(forCity) используется бесконечный цикл
Если у вас работает бесконечный цикл ну конечно же эта функция не пойдет дальше.При исползования делегата ThreadStart в программе будут работать одновременно главный поток, и второй поток. Кроме действий по созданию второго потока, в главном потоке также производятся некоторые действия в фунцкии CheckUpdate. Как только все потоки отработают, программа завершит свое выполнение.
У вас главный поток в последнем строке оператора if,будет ждать завершении второго потока, и поскольку оно не завершится то ваша функция не будет идти дальше.
Ваша функция CheckUpdate отрабатывает в основном потоке, а не в фоновом.
Вот такой код:
Thread t = new Thread(new ThreadStart(CheckUpdate(forCity)));
равносилен следующему:
var r = CheckUpdate(forCity);
Thread t = new Thread(new ThreadStart(r));
То есть второй поток будет создаваться лишь тогда, когда функция CheckUpdate завершит свою работу.
Если вы хотите запустить функцию в фоновом потоке, а не в основном, вам нужна лямбда:
Thread t = new Thread(() => CheckUpdate(forCity));
P. S.: Интересно, что за тип возвращает CheckUpdate, чтобы первоначальный код скомпилировался?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости