Имею такую часть кода в функции
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
, чтобы первоначальный код скомпилировался?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Пытаюсь вызвать функцию rgethstpar_date из библиотеки Honeywell hscnetapidll в C# 4 VS 2010
Доброе утро, у меня из бд отображается datagridView, проблема в том что последний столбец является типом datetime и обратно из грида в бд он не парсится...
Всем приветХочу попробовать сделать видео плеер, который будет читать следующие форматы: AVI, WMV, MOV, MKV, 3gp и т
Как при открытии приложения, загрузить форму Form2 в фоновом режиме, при условии, что сначала загружается FormMain (основная форма, при открытии...