C# control.BeginInvoke()无法调用委托

C# control.BeginInvoke()无法调用委托,c#,delegates,begininvoke,C#,Delegates,Begininvoke,我注意到control.BeginInvoke(委托)有时无法调用委托。我知道BeginInvoke只是创建一条PostMessage,该消息稍后由应用程序处理(PostMessage限制默认为10000)。鉴于我们的应用程序不是很复杂,有没有其他原因导致它无法执行委托?我的代码如下所示 class MyClass : Form{ private bool executing = false; private delegate void DelegateBar(string i

我注意到control.BeginInvoke(委托)有时无法调用委托。我知道BeginInvoke只是创建一条PostMessage,该消息稍后由应用程序处理(PostMessage限制默认为10000)。鉴于我们的应用程序不是很复杂,有没有其他原因导致它无法执行委托?我的代码如下所示

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) 如果您的消费任务花费的时间比FiveSeconds方法更长,则该方法会显示每次都没有被调用

2) 如果使用任务和更新UI的组合导致每次都不调用该方法


3) 如果消费任务中未显示的任何代码可能会改变executing的值(或退出该方法,因为它可以设置为false)

则我认为该代码在发布时没有问题。如果这与您正在使用的代码不匹配,我建议您查找以下代码之一:

1) 如果您的消费任务花费的时间比FiveSeconds方法更长,则该方法会显示每次都没有被调用

2) 如果使用任务和更新UI的组合导致每次都不调用该方法


3) 如果消费任务中未显示的任何代码可能会改变执行的值(或退出方法,因为它可以设置为false)

为什么Bar的签名与DelagetBar不同?这些应该是相配的哦。。那是个打字错误。我已经编辑了帖子。你确定在调用BeginInvoke之前表单已经完全加载了吗@克里斯蒂安,是的,表格已加载。我们的一位用户抱怨应用程序被挂起。查看日志,我们发现在用户报告其挂起之前,Bar在过去7-8小时内每5秒被调用一次,并且工作正常。您的执行标志没有达到您希望的效果。您使用的测试和设置操作是一个基本的线程竞赛。必须使用lock语句防止两个线程同时进入foo()。五秒钟的延迟将使它在大部分时间内工作。直到机器负载过重。为什么Bar的签名与DelagetBar不同?这些应该是相配的哦。。那是个打字错误。我已经编辑了帖子。你确定在调用BeginInvoke之前表单已经完全加载了吗@克里斯蒂安,是的,表格已加载。我们的一位用户抱怨应用程序被挂起。查看日志,我们发现在用户报告其挂起之前,Bar在过去7-8小时内每5秒被调用一次,并且工作正常。您的执行标志没有达到您希望的效果。您使用的测试和设置操作是一个基本的线程竞赛。必须使用lock语句防止两个线程同时进入foo()。五秒钟的延迟将使它在大部分时间内工作。感谢您的响应,根据日志,我确信BeginInvoke()没有执行委托。我以前使用Invoke时,用户抱怨UI挂起的频率更高。但即使在使用BeginInvoke之后,同一用户的UI也会挂起,但挂起的频率要低得多。。我注意到在日志中,“executing”标志为true。感谢您的响应,根据日志,我确信BeginInvoke()没有执行委托。我以前使用Invoke时,用户抱怨UI挂起的频率更高。但即使在使用BeginInvoke之后,同一用户的UI也会挂起,但挂起的频率要低得多。。我注意到在日志中,“执行”标志是正确的。。