繁体   English   中英

异步/等待UI对象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 当您传递引用类型的值(例如IEcheckStatenav参数)时,您正在按值传递引用。 因此,您在呼叫者和被呼叫者之间共享同一个nav对象。

请注意以下最佳做法:

  • 避免async void 使用async Task除非编译器强迫您将其更改为async void
  • Task.Run不是Task.Factory.StartNew

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM