我一直在寻找这个问题的答案,但无法在任何地方找到它。
我写过一个使用Watin的应用程序。它工作正常,除了如果我点击“X”按钮关闭应用程序之前,在Watin完成所有操作之前(在它被丢弃之前,我猜),它不会关闭。我的应用程序仍在运行(虽然表单不再存在),以及所有IE实例。
我想我应该使用FormClosing事件处理程序来杀死Watin,但由于我正在使用using语句,我不知道如何实现它。 这是我正在使用的一段代码:
using (var newBrowser = new IE("http://address.com"))
{
AnalyzeTools FormActions = new AnalyzeTools(progressBar, labelProgress, labelProgressOutOf, richBoxKeywords.Lines.Count());
Analyzer Analytic = new Analyzer(newBrowser, richBoxKeywords.Lines.ToList<string>(), FormActions);
BeingAnalyzed = Analytic;
Analytic.Initialize(textBoxLogin.Text, textBoxPass.Text);
Analytic.HandleAnalysis();
}
修改 好的,我做了更多的麻烦,这就是我想出来的: 该应用程序正在工作,直到它完成,简单。但它并没有完全“正确”完成 - 它崩溃了,因为它无法访问不再存在的形式。
我相信我可以通过创建一个FormClosing或FormClosed事件来解决这个问题,该事件在触发时会修改我的应用程序的行为。自定义“退出”方法。但是,我仍然不会终止Watin(我想做的事),应用程序仍在运行。
问题是,我并不是真的需要它来完成它应该采取的所有行动。
我对终止的想法是好的吗?有没有办法终止Watin而不放弃使用声明的想法?
编辑2: 好的,我尝试了一些新的东西。 我创建了要求做出决定的消息框。我尝试使用Application.Exit()来终止,但它不能像我希望的那样工作。应用程序的vshost仍在运行(WatiN?)。 所以我想我的问题是:终止WatiN以删除using语句的唯一方法是,让IE对象在类中的任何地方都可用,并在用户选择终止它时将其处理掉?
答案 0 :(得分:1)
我认为你需要做的是创建一个IE实例,然后关闭该实例。当您再次需要它时,您可以重新创建实例。很久以前我在Stackoverflow上发现了这个问题,当时我遇到了类似的问题,但我再也找不到它了。
public sealed class BrowserIE
{
static readonly IE _Instance = new IE();
static BrowserIE()
{}
BrowserIE()
{ }
public static IE Instance
{
get { return _Instance; }
}
}
使用上面的代码创建一个类。使用
var browser = BrowserIE.Instance("myUrl");
当你完成它时使用:
browser.Close();
希望这会有所帮助。如果您有任何其他问题,我会尽力提供帮助。
答案 1 :(得分:1)
您使用的是哪个版本的WatIn
Watin有针对这项工作的特定处置方法
browser.Dispose();