C# Delegate.BeginInvoke回调阻止调用线程?

C# Delegate.BeginInvoke回调阻止调用线程?,c#,.net,asynchronous,delegates,C#,.net,Asynchronous,Delegates,我真的不知道该从哪里解决这个问题,因为我对异步编程不是特别熟悉。我有一个调用委托的BeginInvoke方法的循环。当代理的回调被执行时,循环停止执行(不应该)。我猜它运行的线程被阻塞了,但我真的不确定。下面是代码的简化版本: public class TestClass { private readonly IService service; private delegate void TestDelegate(); private bool conditionIsMe

我真的不知道该从哪里解决这个问题,因为我对异步编程不是特别熟悉。我有一个调用委托的BeginInvoke方法的循环。当代理的回调被执行时,循环停止执行(不应该)。我猜它运行的线程被阻塞了,但我真的不确定。下面是代码的简化版本:

public class TestClass
{
    private readonly IService service;
    private delegate void TestDelegate();
    private bool conditionIsMet = true;

    public TestClass( IService service )
    {
        this.service = service;
    }

    public void PerformTask()
    {
        while ( conditionIsMet )
        {
            var testDelegate = new TestDelegate( service.DoSomething );
            testDelegate.BeginInvoke( TestCallback, null );

            Thread.Sleep( 1 );
        }
    }

    private void TestCallback( IAsyncResult result )
    {
        var asyncResult = ( AsyncResult ) result;
        var testDelegate = ( TestDelegate ) asyncResult.AsyncDelegate;
        testDelegate.EndInvoke( asyncResult );

        // After exiting this method the loop in PerformTask() ceases to execute.
        // Is it being blocked here somehow?
    }
}
在实践中,代码有更多的内容,但据我所知,所涉及的基本组件都在这里。在上面的代码示例中,我在其中添加了一条注释,以指示代码最后执行的位置(无论如何,在VS调试器中)

我假设我在执行委托异步调用的过程中犯了一些基本错误,但是我找不到任何文档来解释它。知道为什么会这样吗

更新


作为进一步测试的一部分,我在没有EndInvoke调用的情况下尝试了这个方法(我知道,这在实践中是个坏主意),但行为没有改变-它仍然无法继续执行循环。

我认为它对我来说可以。您是否在控制台应用程序中运行它

你需要停止这种行为

class Program
{
    static void Main(string[] args)
    {
        TestClass t = new TestClass(new Service());
        t.PerformTask();

        Console.ReadKey();
    }
}

public class Service : IService
{
    public void DoSomething()
    {
        Console.WriteLine("Doing something");
    }
}

public class TestClass
{
    private readonly IService service;
    private delegate void TestDelegate();
    private bool conditionIsMet = true;

    public TestClass(IService service)
    {
        this.service = service;
    }

    public void PerformTask()
    {
        while (conditionIsMet)
        {
            var testDelegate = new TestDelegate(service.DoSomething);
            testDelegate.BeginInvoke(TestCallback, null);

            Thread.Sleep(1);
        }
    }

    private void TestCallback(IAsyncResult result)
    {
        var asyncResult = (AsyncResult)result;
        var testDelegate = (TestDelegate)asyncResult.AsyncDelegate;
        testDelegate.EndInvoke(asyncResult);

        // After exiting this method the loop in PerformTask() ceases to execute.
        // Is it being blocked here somehow?
    }
}

public interface IService
{
    void DoSomething();
}

您能否将
conditionIsMet
声明为
volatile
,并检查谁正在更改此标志。我想尝试此操作不会有什么坏处,但我认为在这种情况下它不会有帮助。循环的条件仅通过父线程设置(当服务停止时)。我会试试看到底会发生什么。干杯,不,不幸的是,这种方法没有改变。它会在任何被吞没的地方抛出异常吗?据我所知不是这样-我的代码目前根本没有任何异常处理代码,所以我希望调试器会发现异常-或者应用程序会退出。我看不到这两种行为。是否有其他方法确定是否发生异常?它作为Windows服务的一部分运行-除非服务停止,否则while循环不会退出。基本上,循环是从队列中读取的,每次在队列中发现一个项目时,它都应该异步处理该项目——但循环不应该因为任何原因退出。我通过在循环后放置断点来验证这一点,但它从未被击中。