2013-06-26 3 views
2

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

У меня есть фоновый поток, который при запросе отключит кучу флажков на форме, созданной в основном потоке. Чтобы сделать это, мне нужно безопасно перекрещивать потоки с помощью invoke и делегата, но я должен делать это неправильно. В нижней строке, когда я проверяю это в отладчике, я вижу, что он дважды проходит через часть ACTION кода, если InvokeRequired. Я могу обойти это с помощью брекетинга ACTION с помощью else, и хотя он не будет проходить через else дважды, он все равно попытается снова пройти этот метод.

delegate void ManualCurtainShuttoffHandler(); 
public void ManualCurtainShutoff() 
{ 
    if (InvokeRequired)          
    { 
     Invoke(new ManualCurtainShuttoffHandler(ManualCurtainShutoff));   
    } 
    // ACTION: Disable check boxes 
} 

Я просто хотел бы знать, почему он проходит через метод два раза. Дайте мне знать, если вам нужна дополнительная информация, и я был бы рад поделиться ею с вами.

ответ

5

Только потому, что вы вызываете Invoke, это не останавливает выполнение текущего метода. Быстрое и простое решение, чтобы просто return после вызова Invoke:

delegate void ManualCurtainShuttoffHandler(); 
public void ManualCurtainShutoff() 
{ 
    if (InvokeRequired)          
    { 
     Invoke(new ManualCurtainShuttoffHandler(ManualCurtainShutoff));   
     return; 
    } 
    // ACTION: Disable check boxes 
} 

Это пропустить остальные исполнения ManualCurtainShutoff, который работает на фоновом потоке в то же время продвижения новый выполнение метода на основной поток.

2

Вызов вызовет вашу функцию для вызова снова в другой теме (это его цель). Вы должны добавить возврат после вызова Invoke. Идея состоит в том, что тогда ваша функция будет вызвана снова (это то, что вы хотите), и это время InvokeRequired будет ложным, поэтому ваши действия будут иметь место.

Редактировать: dang, к тому времени, когда я закончил писать, я был избит до удара. Ну что ж!