簡體   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