Почему вы можете вызывать BeginInvoke более одного раза для одного и того же экземпляра делегата? - PullRequest
1 голос
/ 10 марта 2010

Я думал, что вызов BeginInvoke более одного раза для одного и того же экземпляра делегата вызовет проблемы, но я попробовал это, и это работает. Почему это?

Является ли объект IAsyncResult, возвращаемый с каждым BeginInvoke, вызываемым уникальным, вместо каждого экземпляра делегата?

Другими словами, нужен ли мне только один экземпляр делегата для создания нескольких вызовов его функции?

Ответы [ 4 ]

3 голосов
/ 10 марта 2010

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

Да, вам нужен только один экземпляр делегата. Обратите внимание, что делегаты неизменны - вызов BeginInvoke не изменит его состояние. Вы можете безопасно взять копию ссылки на делегат, будучи уверенными в том, что вызов Delegate.Combine и т. Д. Всегда создаст новый экземпляр делегата, а не изменит существующий.

2 голосов
/ 10 марта 2010

Каждый вызов BeginInvoke запускает новый запрос в пул потоков .net.

Вполне допустимо звонить BeginInvoke несколько раз. Каждый IAsyncResult объект уникален для этого конкретного вызова BeginInvoke.

Только будьте осторожны, чтобы убедиться, что вы делаете соответствующий вызов EndInvoke для каждого BeginInvoke вызова, который вы делаете, чтобы убедиться, что ресурсы очищены.

(Обратите внимание, что каждый вызов не обязательно равен потоку. BeginInvoke передает запросы в пул потоков, который может поставить в очередь запросы, если все потоки в пуле уже используются)

1 голос
/ 10 марта 2010

Да.

Каждый вызов BeginInvoke возвращает различный IAsyncResult, который можно передать EndInvoke в любом порядке.

Вы можете использовать один и тот же делегат для выполнения нескольких асинхронных вызовов.

1 голос
/ 10 марта 2010

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

...