Проблема при роботе с потоками C#

310
31 мая 2017, 02:29

Имею такую часть кода в функции

        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.

Answer 1

CheckUpdate(forCity) используется бесконечный цикл

Если у вас работает бесконечный цикл ну конечно же эта функция не пойдет дальше.При исползования делегата ThreadStart в программе будут работать одновременно главный поток, и второй поток. Кроме действий по созданию второго потока, в главном потоке также производятся некоторые действия в фунцкии CheckUpdate. Как только все потоки отработают, программа завершит свое выполнение. У вас главный поток в последнем строке оператора if,будет ждать завершении второго потока, и поскольку оно не завершится то ваша функция не будет идти дальше.

Answer 2

Ваша функция 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, чтобы первоначальный код скомпилировался?

READ ALSO
Не могу вызвать функцию из dll в C#

Не могу вызвать функцию из dll в C#

Пытаюсь вызвать функцию rgethstpar_date из библиотеки Honeywell hscnetapidll в C# 4 VS 2010

357
Конвертер DateTime из dataGridView в MsSql

Конвертер DateTime из dataGridView в MsSql

Доброе утро, у меня из бд отображается datagridView, проблема в том что последний столбец является типом datetime и обратно из грида в бд он не парсится...

254
Видео плеер своими руками на C#

Видео плеер своими руками на C#

Всем приветХочу попробовать сделать видео плеер, который будет читать следующие форматы: AVI, WMV, MOV, MKV, 3gp и т

475
Как загрузить вторую форму в фоновом режиме?

Как загрузить вторую форму в фоновом режиме?

Как при открытии приложения, загрузить форму Form2 в фоновом режиме, при условии, что сначала загружается FormMain (основная форма, при открытии...

217