2013-08-01 4 views
0

Я пытаюсь получить значение из функции делегата. В основном, я пытаюсь получить длину строки richboxtext из функции делегата.Функция делегата для возврата значения

Вот моя функция

Private Delegate Function getrichlengthmain(ByVal TB As RichTextBox) As String 

Private Function getrichlenghtdele(ByVal TB As RichTextBox) As string 

     Return TB.Lines.Length 


End Function 

И я зову его

Dim d As getrichlengthmain 

     d = AddressOf getrichlenghtdele 

dim returnvalue as string 

returnvalue = d.BeginInvoke(FstList,nothing,nothing) 

2 проблемы в этом коде

первая проблема

при изменении кода от " returnvalue = d.BeginInvoke (FstList, ничего, ничего) "to" d.BeginInvoke (FstList, ничего, ничего) "

Перекрестный поток ошибок в то время как всплывающее окно debuiging

2-й проблему

Как получить значение из функции без получения какой-либо перекрестной ошибки потока.

Очень благодарен за ваше время и заблаговременно за его решение.

+1

'BeginInvoke' используется для асинхронного вызова делегата. Это то, что вы хотите сделать? Если это так, вы не можете надеяться получить результат, пока функция все еще может работать. Если это не так, почему вы используете 'BeginInvoke'? – hvd

+0

Спасибо за ответ. Я использую begininvoke, потому что я хочу, чтобы функция безопасно получала lengthlength из richtextbox. Есть ли другой способ безопасного получения длины строки из richtextbox с помощью функции. –

ответ

0

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

Существует (по крайней мере) два способа решения проблемы, которую вы имеете, ленивый путь и правильный путь. Для того, чтобы решить эту проблему ленивый путь, вы просто остановить проверку незаконных перекрестных пронизывающих звонков управления от происходит путем включения этой строки кода где-то в компоненте UI:

Control.CheckForIllegalCrossThreadCalls = False 

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

+0

Установка 'CheckForIllegalCrossThreadCalls' сделает так, что код иногда работает, в зависимости от обстоятельств, обычно выходящих за рамки контроля программиста. Иногда иногда могут появляться как «обычно», иногда - «редко». Я знаю, что вы не рекомендуете это, но вы говорите, что это решает проблему, когда, вероятно, этого не происходит. – hvd

+0

Спасибо за ответ. Да CheckForIllegalCrossThreadCalls = False не является хорошей практикой. Обычно это приводит к сбою моего заявления. Вот почему я хочу безопасно вызвать richtextbox, чтобы вернуть его значение. Для этого я использую функцию делегата, но придерживаюсь его. Wohoooo очень thaaaaaaaaaaaaanks. Ваша ссылка решает мою проблему. –