【发布时间】:2014-02-11 00:32:44
【问题描述】:
我在理解如何从我的异步方法访问 UI 对象时遇到了一些麻烦。
UI 之前
private void btnNavigate_Click(object sender, EventArgs e)
{
Navigation n = new Navigation();
n.Destination = cbQuickNav.Text;
n.IEcheckState(n);
}
之前的异步方法
public async void IEcheckState(Navigation nav)
{
Settings.AutoStartDialogWatcher = false;
var ie = Browser.AttachTo<IE>(Find.ByTitle("TS"));
bool success = false;
await Task.Factory.StartNew(() =>
{
ie.GoTo("https://example.com");
if (ie.ContainsText("Invalid login")) //Invalid login, please retry.
{
TSLogin(ie, nav);
}
else
{
quickNav(nav);
}
});
}
我读到 async/await 不允许通过引用传递对象。导航对象在主 UI 线程上创建,并且数据绑定到表单上的控件。我希望能够让对象通过线程持续存在,但我不知道如何完成此操作或如何解决此问题。
编辑
按价值传递实际上正如斯蒂芬在下面建议的那样工作。我发现我的代码没有正确设置对象属性......我的实现都是错误的。我不需要传递对象,只需调用该对象的方法(例如 n.IEcheckState()),然后使用“this”属性访问属性。
用户界面之后
private void btnNavigate_Click(object sender, EventArgs e)
{
Navigation n = new Navigation();
n.Destination = cbQuickNav.Text;
n.IEcheckState();
}
之后的异步方法
public async Task IEcheckState()
{
Settings.AutoStartDialogWatcher = false;
var ie = Browser.AttachTo<IE>(Find.ByTitle("TS"));
bool success = false;
await Task.Factory.StartNew(() =>
{
ie.GoTo("https://example.com");
if (ie.ContainsText("Invalid login")) //Invalid login, please retry.
{
TSLogin(ie);
}
else
{
quickNav(this);
}
});
}
【问题讨论】:
标签: c# multithreading winforms asynchronous