По 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
в потоке пользовательского интерфейса, чтобы он был создан - в вашем коде это должно произойти до того, как вы впервые получаете доступ к этому элементу управления/форме из любого потока, который не является нитью пользовательского интерфейса.
[/ ОБНОВЛЕНИЕ]
IsHandleCreated ложно, и после того, как BeginInvoke назвать это поймать исключение. «Invoke или BeginInvoke нельзя вызвать в элементе управления до тех пор, пока не будет создан дескриптор окна». –
@AtomSkaaskaHic извините, моя ошибка ... см. Мой обновленный ответ. – Yahia
Решенный! Мой пользовательский интерфейс не создается. Я просто положил задержку перед вызовом этой функции, и она работает! –