C# 异步/等待UI对象winforms
我在理解如何从异步方法访问UI对象时遇到一些问题 之前的用户界面C# 异步/等待UI对象winforms,c#,multithreading,winforms,asynchronous,C#,Multithreading,Winforms,Asynchronous,我在理解如何从异步方法访问UI对象时遇到一些问题 之前的用户界面 private void btnNavigate_Click(object sender, EventArgs e) { Navigation n = new Navigation(); n.Destination = cbQuickNav.Text; n.IEcheckState(n); } public async void IEcheckState(Navi
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);
}
});
}
之前的异步方法
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);
}
});
}
之后的异步方法
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);
}
});
}
公共异步任务IEcheckState()
{
Settings.AutoStartDialogWatcher=false;
var ie=Browser.AttachTo(Find.ByTitle(“TS”);
布尔成功=假;
等待任务。工厂。开始新建(()=>
{
即后藤(“https://example.com");
如果(ie.ContainsText(“无效登录”)//无效登录,请重试。
{
TSLogin(ie);
}
其他的
{
快速导航(本);
}
});
}
我读到async/await不允许通过引用传递对象
它不允许您使用ref
。当您传递引用类型的值(例如,IEcheckState
的nav
参数)时,您是按值传递引用。因此,您在调用者和被调用者之间共享相同的nav
对象
请注意以下最佳做法:
- 避免
。使用异步无效
,除非编译器强制您将其更改为async Task
async void
- 首选
而不是Task.Run
Task.Factory.StartNew
Microsoft.Bcl.Async
,而对于该库,您必须使用TaskEx.Run
而不是Task.Run
。