我不确定在哪里查看这个问题,因为我对异步编程并不是特别熟悉。我有一个循环调用委托的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调用的情况下尝试了这个(我知道,实际上是个坏主意)但是行为没有变化 - 它仍然无法继续执行循环。
答案 0 :(得分:0)
我觉得它对我有用。你在控制台应用程序中运行它吗?
你需要停止退出。
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();
}