我们项目中使用到了HttpWebRequest.BeginGetResponse下载图片,发现有时候会出现执行到这里之后,程序似乎死了,完全失去响应。如果在vs中HttpWebRequest.BeginGetResponse(Callback)调用这里断点,停下来后 ,按F10单步,会发现永远不会执行到下一步,也不会回调Callback方法。
单看特征,十分符合死锁的情况,但是百思不解为何会造成死锁。本来BeginXXX方法属于异步调用,不应该会阻塞当前线程的。
后来通过使用BackgroundWorker对调用进行封装,解决了这个问题。看来有时候,即使自己没有做阻碍UI线程的操作,对某些系统接口的调用也存在潜在的阻塞风险,此时最好放在后台线程中进行调用。