我试图让 Watin 在我的 SSIS 脚本任务中工作,通过在新线程中打开 IE 来执行一些自动化操作,做一些事情,找到最终值并基本上在父线程中返回/设置该值。
所以我现在有这个:
public partial class TestWatin{
public void Main()
{
String finalValueFromWeb = "";
Thread runnerThread = new Thread(delegate() { getDAFValue(ref finalValueFromWeb ); });
runnerThread.ApartmentState = ApartmentState.STA;
runnerThread.Start();
runnerThread.Join();
MessageBox.Show(finalValueFromWeb);
//here i want to use the value of finalValueFromWeb to download a file
//but if i try to access finalValueFromWeb the process would fail.
}
//do the Watin stuff here
public void findHiddenURL(String refObject)
{
//setup page controls, press search, grab the value of "hiddenURL"
IE ie = new IE("some_webadress_to_go_to");
ie.Visible = false;
ie.SelectList("testID1").Option("Car").Select();
ie.SelectList("testID2").Option("JAP").Select();
ie.SelectList("testID3").Option("2012").Select();
ie.Button("testSearch").Click();
Link link = ie.Link("hiddenURL");
ie.Close();
//fails here?
refObject = link.Url;
}
}
我基本上想要的是让 findHiddenURL()
为我找到一个值,该值是一个包含一些 CSV url 的字符串。然后我想使用该字符串下载 CSV 文件并进行处理。
问题是当我尝试在进程失败的 findHiddenURL()
中设置 finalValueFromWeb
的值时。异常消息显示 The Object Reference is not set to an instance of an object
有人可以告诉我应该如何解决这个问题吗?做这种事情的正确方法是什么?谢谢
最佳答案
使变量成为类的成员并尝试锁定它。你可以使用 c# 锁:
http://msdn.microsoft.com/en-us/library/c5kehkcz%28v=vs.71%29.aspx
protected string finalValueFromWeb ;
....
public void Main()
{
...
lock(finalValueFromWeb)
{
MessageBox.Show(finalValueFromWeb);
}
}
public void findHiddenURL(String refObject)
{
...
lock(finalValueFromWeb)
{
finalValueFromWeb = link.Url;
}
}
关于c# - Watin ApartmentState.STA 线程和父线程之间的共享变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13949203/