control.BeginInvoke () не может вызвать делегат - PullRequest
2 голосов
/ 07 июня 2011

Я заметил, что control.BeginInvoke (делегат) иногда не может вызвать делегат.Я понимаю, что BeginInvoke просто создает сообщение PostMessage, и это сообщение обрабатывается приложением позже (ограничение количества сообщений по умолчанию составляет 10 000).Учитывая, что наше приложение не очень сложное, есть ли другая причина, по которой оно может не выполнить делегат?Мой код выглядит примерно так:

class MyClass : Form{

    private bool executing = false;
    private delegate void DelegateBar(string info, int total, bool status, object obj);
    private void Bar(string info, int total, bool status, object obj){
        log("Enterning Bar");
        // Update something on UI
        executing = false;
        log("Exiting Bar");
    }
    public void foo(){
        log("Entering Foo");
        executing = true;
            try{
            // do something over the network
            }catch(Exception e){
                // probably network down. Lets not worry about it
            }
        DelegateBar barPtr = new DelegateBar(Bar);
        // Update UI .. call on form : form is a control
        this.BeginInvoke(barPtr, new object[] {"someInfo", 3, false, null});
        log("Exiting Fool");
    }

    public void callMeEveryFiveSeconds(){
        if(!executing) foo();
    }

    private delegate void DelegateCallMe();

    // execute every 5 seconds.
    private void timer1_Tick(object sender, EventArgs e)
    {
        Delegate del = new DelegateCallMe(callMeEveryFiveSeconds);
        // appoligies if syntax is not right, it to convey the idea that callMeEveryFiveSeconds is called on the main thread (asynchronously)
        this.beginInvoke(del, new object[]{});
    }
}

1 Ответ

0 голосов
/ 08 июня 2011

Код выглядит хорошо для меня, как опубликовано. Если это не соответствует вашему используемому коду, я бы посоветовал поискать одно из следующего:

1) Если ваша задача потребления занимает больше времени, чем метод FiveSeconds, чтобы создать видимость того, что он не вызывается каждый раз

2) Если сочетание задачи потребления и обновления пользовательского интерфейса приводит к тому, что метод не вызывается каждый раз

3) Если какой-либо код, не показанный в задаче-потребителе, может изменить значение выполнения (или выйти из метода, поскольку для него может быть установлено значение false)

...