2010-07-19 58 views
0

我有一个应用程序使用Webbrowser控件导航到一些供应商的网站和刮报告。由于一个供应商有多个帐户,因此我需要让浏览器结束会话并清除所有设置的Cookie。我正在使用针对wininet.dll的API调用,并且能够实现期望的结果。但是,间歇性地,我得到INTERNET_OPTION_END_BROWSER_SESSION的InternetSetOption上出现死锁。InternetSetOption死锁?

这是非常线性码和InternetSetOption从一个单独的线程在一个地方被调用。难以弄清楚的是,在调试中运行时,我很少能够重现该问题。只要我在VS之外编译和运行,它会很快发生。我通过在运行时将消息泵送到控制台来隔离它。

有几次,我已经能够捕捉在调试的问题,它只是显示InternetSetOption作为下一个语句,并坐镇,没有任何异常或错误,没有在输出窗口。 InternetSetOption应返回布尔值,但该程序不会再继续,我从来没有从API调用中获得任何回报。我试着查看抛出的最后一条错误消息,但在这种情况下,它并没有帮助,因为它从不抛出错误。

任何人有什么输入,我可以进一步做什么来调试?

声明如下:

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)] 
private static extern bool InternetSetOption(
    IntPtr hInternet, 
    int dwOption, 
    IntPtr lpBuffer, 
    int lpdwBufferLength); 

而且通过所谓:

InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0); 
+0

这与C#有什么关系? – 2010-07-27 19:25:06

+0

该应用程序是用C#编写的,包含一个Web浏览器控件 – kmfk 2010-07-27 19:35:36

回答

2

对于任何人谁遇到这一点,一次偶然的机会,有同样的问题 - 这个问题似乎由功能引起的我在MSDN的网站上找到了清除缓存和Cookie的信息。 found here

有几个问题在ClearCache()函数,一个x86和x64,以及如何引用的缓存文件将其删除之间 -

在目前的功能,卡列斯DeleteUrlCacheEntry像这样:

DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName); 

然而,在X64的是应该是

DeleteUrlCacheEntry(internetCacheEntry.lpszLocalFileName); 

你必须基于这些平台之间切换,一个单一的参考不工作的x64和x86。但是,对我来说,莫名其妙。这个函数经常会抛出Access Violation异常,即使在被捕获和处理时,我相信这是InternetSetOption的根源,表现为僵局。同样,由于死锁的奇怪特性,我永远无法彻底解决它,因为我使用了ClearCache()函数和InternetSetOption。改变两个函数调用的顺序并不能纠正它。

我删除了WebBrowserHelper类和我通过执行RUNDLL32并等待该进程退出使出回清除缓存和Cookie。

希望能帮助别人!