2012-01-20 2 views
3

Первая тема What wrong with my InvokeRequiedЧто не так с моей InvokeRequied # 2?

Я следовал за ответом, что он рекомендовал его мне, но я нашел новую проблему.

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

Что не так с моим кодом?

Как решить эту проблему?

enter image description here

ответ

9

По MSDNInvokeRequired может вернуться false даже в тех случаях, когда InvokeRequired должны быть true, а именно - в том случае, когда вы получаете доступ InvokeRequired до Handle этого контроля/форма (или родителя его) было создано.

В основном ваш чек неполный, что приводит к результату, который вы видите.

Вы должны проверить IsHandleCreated - если это false, то вам нужно будет использовать Invoke/BeginInvoke независимо от того, какого InvokeRequired возвращается.

[UPDATE] НО: Это, как правило, не будет работать, так как робастно Invoke/BeginInvoke проверки, какой поток, созданный Handle делать свою магию ... [/ UPDATE]

Только если IsHandleCreated является true вы действуете на основании каких InvokeRequired возвращаются - то вдоль линий:

if (control.IsHandleCreated) 
{ 
    if (control.InvokeRequired) 
    { 
     control.BeginInvoke(action); 
    } 
    else 
    { 
     action.Invoke(); 
    } 
} 
else 
{ 
    // in this case InvokeRequired might lie - you need to make sure that this never happens! 
    throw new Exception ("Somehow Handle has not yet been created on the UI thread!"); 
} 

[UPDATE]

Таким образом, важно следующее, чтобы избежать этой проблемы

Всегда убедитесь, что Handle уже создан ДО первого доступа на потоке, чем в потоке пользовательского интерфейса.

В соответствии с MSDN вам нужно всего лишь ссылаться на control.Handle в потоке пользовательского интерфейса, чтобы он был создан - в вашем коде это должно произойти до того, как вы впервые получаете доступ к этому элементу управления/форме из любого потока, который не является нитью пользовательского интерфейса.

[/ ОБНОВЛЕНИЕ]

+0

IsHandleCreated ложно, и после того, как BeginInvoke назвать это поймать исключение. «Invoke или BeginInvoke нельзя вызвать в элементе управления до тех пор, пока не будет создан дескриптор окна». –

+0

@AtomSkaaskaHic извините, моя ошибка ... см. Мой обновленный ответ. – Yahia

+0

Решенный! Мой пользовательский интерфейс не создается. Я просто положил задержку перед вызовом этой функции, и она работает! –

Смежные вопросы