![](/img/trans.png)
[英]Accessing UI controls in Task.Run with async/await on WinForms
[英]async/await UI object winforms
我在理解如何从异步方法访问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”属性访问属性。
UI之后
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);
}
});
}
我读过async / await不允许通过引用传递对象。
它不允许您使用ref
。 当您传递引用类型的值(例如IEcheckState
的nav
参数)时,您正在按值传递引用。 因此,您在呼叫者和被呼叫者之间共享同一个nav
对象。
请注意以下最佳做法:
async void
。 使用async Task
除非编译器强迫您将其更改为async void
。 Task.Run
不是Task.Factory.StartNew
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.