Действительно ли необходим Delegate.EndInvoke ()?

print type(variable_name)

я также настоятельно рекомендую IPython интерактивный интерпретатор при контакте с вопросами как это. Это позволяет Вам тип variable_name? и возвратит целый список информации об объекте включая тип и строку документа для типа.

, например,

In [9]: var = 123

In [10]: var?
Type:       int
Base Class: 
String Form:    123
Namespace:  Interactive
Docstring:
    int(x[, base]) -> integer

Преобразовывают строку или число к целому числу, если это возможно. Аргумент с плавающей точкой будет усеченным по направлению к нулю (это не включает строковое представление числа с плавающей точкой!) При преобразовании строки, используйте дополнительную основу. Это - ошибка предоставить основу при преобразовании нестроки. Если аргумент будет вне целочисленного диапазона, то длинный объект будет возвращен вместо этого.

25
задан Achilles 3 January 2011 в 14:01
поделиться

4 ответа

Из статьи MSDN «Вызов синхронных методов асинхронно» :

Независимо от того, какую технику вы используете, всегда вызывайте EndInvoke для завершения асинхронного вызова.

Теперь, есть теория, а затем есть практика. Как и многие другие разработчики до вас, вы обнаружили, что часто можете игнорировать это задокументированное требование. Это может быть деталь реализации, действительно ли EndInvoke делает что-то абсолютно необходимое для предотвращения сбоя вашего приложения, утечки памяти и т. Д. Но вот в чем дело: если это задокументированное требование, вам действительно следует это сделать . Это не просто теория; речь идет о защите себя в случае перемен.

Задокументировав это требование, разработчики этого механизма асинхронного вызова в основном дали себе свободу изменить способ BeginInvoke и EndInvoke работать по линии связи так, чтобы, если имелась достаточная причина (например, повышение производительности) , EndInvoke может внезапно стать намного более необходимым. Предположим, это внезапно приведет к тупику, если вы забудете это. Они уже укрылись, сказав всегда звоните EndInvoke ; если ваше приложение перестает работать, потому что вы не выполняете это требование, ответственность лежит на вас.

1114 Я не говорю, что это вероятный сценарий. Моя точка зрения заключается в том, что вы не должны - или, по крайней мере, я бы не - спросить: «Это действительно необходимо?» с менталитетом . Если мне удастся уйти от этого, то я сделаю , поскольку задокументировано , что вы должны это сделать.

45
ответ дан 28 November 2019 в 18:08
поделиться

Я слышал о проблемах утечки памяти, которые могут возникнуть.

По поиску по ключевым словам я нашел хорошее обсуждение.

Does not calling EndInvoke *really* cause a memory leak ?

It can but it won't necessarily. Technically there is no such thing as a memory leak in .NET. Eventually the memory will be reclaimed by the GC. The problem is that it might be around a long time. The reason that you should call EndInvoke is because the results of the invocation (even if there is no return value) must be cached by .NET until EndInvoke is called. For example if the invoked code throws an exception then the exception is cached in the invocation data. Until you call EndInvoke it remains in memory. After you call EndInvoke the memory can be released.

Вот ссылка ,

Другая ссылка

9
ответ дан 28 November 2019 в 18:08
поделиться

Было задокументировано, что EndInvoke не требуется (не выделены неуправляемые ресурсы - при условии, что вы не ожидаете IAsyncResult) при использовании BeginInvoke для выполнения действий с потоком GUI в WinForms применение. [тысяча сто двадцать одна]

Однако это конкретное исключение из общего правила: для каждого BeginOperation должно быть соответствие EndOperation. Как уже отмечалось в другом A здесь: если код доступа GUI может выдать, вам понадобится EndInvoke, чтобы получить исключение.

См. Здесь (вроде) официальное подтверждение: http://blogs.msdn.com/b/cbrumme/archive/2003/05/06/51385.aspx#51395 (это комментарий от Криса Брумми 12 May 2003 5:50pm.

Дополнительно: Документация для Control.BeginInvoke включает в себя это замечание:

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

Так что это официально: использование WinForm асинхронного делегата для выполнения действий в потоке GUI не требует EndInvoke (если только вам не нужно возвращаемое значение или возможное исключение, в любом случае рассмотрите используя Invoke ).

1
ответ дан 28 November 2019 в 18:08
поделиться

Из документации Windows Form по Control.BeginInvoke ()

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

Это частный случай асинхронного вызова Windows Form в потоке пользовательского интерфейса , и это это не относится к общему случаю , но это может помочь в этой ситуации.

0
ответ дан 28 November 2019 в 18:08
поделиться
Другие вопросы по тегам:

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