ThreadStateException occures при попытке перезапустить поток

Другой подход в зависимости от того, как вы меняете div. Если вы используете JQuery для изменения содержимого div с помощью метода html (), вы можете расширить этот метод и вызвать функцию регистрации каждый раз, когда вы помещаете html в div.

(function( $, oldHtmlMethod ){
    // Override the core html method in the jQuery object.
    $.fn.html = function(){
        // Execute the original HTML method using the
        // augmented arguments collection.

        var results = oldHtmlMethod.apply( this, arguments );
        com.invisibility.elements.findAndRegisterElements(this);
        return results;

    };
})( jQuery, jQuery.fn.html );

Мы просто перехватываем вызывает html (), вызывает функцию регистрации с этим, которая в контексте относится к целевому элементу, получающему новый контент, затем мы передаем вызов исходной функции jquery.html (). Не забудьте вернуть результаты исходного метода html (), потому что JQuery ожидает его для цепочки методов.

Для получения дополнительной информации об переопределении и расширении метода проверьте http: //www.bennadel. com / blog / 2009-Using-Self-Executing-Function-Arguments-To-Override-Core-jQuery-Methods.htm , где я скрещивал функцию закрытия. Также ознакомьтесь с учебником плагинов на сайте JQuery.

6
задан burning_LEGION 11 August 2012 в 15:40
поделиться

3 ответа

Проблема состоит в том, что у Вас есть код, который сначала проверяет, должен ли он создать объект нового потока и другую часть кода, который определяет, начать ли объект потока. Из-за условий состязания и подобных вещей, Ваш код мог бы закончить тем, что пытался назвать.Start на существующем объекте потока. Рассмотрение Вас не отправляет детали позади переменной проверки, невозможно знать то, что могло бы инициировать это поведение.

Необходимо реорганизовать код так, чтобы.Start, как гарантировали, только назовут на новых объектах. Короче говоря, необходимо поместить метод Запуска в тот же оператор "if" как тот, который создает объект нового потока.

Лично, я попытался бы реорганизовать весь код так, чтобы я не должен был создавать другой поток, но переносить код в объекте потока в цикле так, чтобы поток просто продолжил идти.

3
ответ дан 10 December 2019 в 00:46
поделиться

Для потока возможно быть больше чем в одном состоянии сразу поэтому, свойство ThreadState является на самом деле битовым массивом возможных состояний. Так тестирование на равенство со всего одним состоянием не даст Вам правильный результат. Необходимо было бы сделать что-то как:

if((mThread.ThreadState & ThreadState.Running) != 0)

Однако проверка состояния потока является несправедливостью, чтобы сделать что-либо. Я не совсем ясен, чего Вы пытаетесь достигнуть, но я предположу, что Вы ожидаете потока для завершения прежде, чем перезапустить его. В этом случае необходимо сделать:

mThread.Join();
mThread = new Thread(new ParameterizedThreadStart(Monitor));
if(check)
    mThread.Start(60000);
else
    mThread.Start(0);

Хотя, если Вы описываете проблему, Вы пытаетесь решить более подробно, я почти уверен, что будет лучшее решение. При ждании потока для окончания только для перезапуска снова не кажется что эффективным мне. Возможно, Вам просто нужна некоторая коммуникация межпотока?

John.

6
ответ дан 10 December 2019 в 00:46
поделиться

ThreadStateException брошен, потому что Вы пытаетесь запустить поток, это не находится в startable состоянии. Наиболее вероятные ситуации состояли бы в том, что это уже работает, или что это полностью вышло.

Существует потенциально пара вещей, которые могли бы происходить. Сначала, поток, возможно, перешел от Выполнения до StopRequested, который еще не полностью останавливается, таким образом, Ваша логика не создает новый поток, и Вы пытаетесь запустить поток, который только что закончил работать или собирается закончить работать (ни один из которых не является допустимым состоянием для перезапуска).

Другая возможность состоит в том, что поток был прерван. Потоки, которые прерываются, переходят к Прерванному состоянию, не Остановленному состоянию, и конечно также не допустимы для перезапуска.

Действительно, единственный вид потока, который все еще жив, который может быть "перезапущен", является тем, который это приостановлено. Вы могли бы хотеть использовать это условное выражение вместо этого:

if (this.mThread == null || this.mThread.ThreadState != ThreadState.Suspended)

1
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: