Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步/等待UI对象winforms_C#_Multithreading_Winforms_Asynchronous - Fatal编程技术网

C# 异步/等待UI对象winforms

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

我在理解如何从异步方法访问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);
            }
        });
    }
之前的异步方法

 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

谢谢Stephen,他帮了我很大的忙。我正在运行.Net 4.0,似乎无法使用Task.Run。你知道为什么会这样吗?@jmyns:知道。我假设您使用的是
Microsoft.Bcl.Async
,而对于该库,您必须使用
TaskEx.Run
而不是
Task.Run