为什么只有在退出MethodTest时才会触发操作?

时间:2014-05-09 13:51:50

标签: c# asynchronous task async-await webclient

action.Invoke()不会调用"操作"退出MethodTest之前的操作!

     private void MethodTest(string query)
     {
        try
        {
            var webClient = new WebClient();
            string webContent = string.Empty;
            int index;
            Action action = async delegate()
            {
                webContent = await webClient.DownloadStringTaskAsync(url);
                //Add break point above
            };

            action.Invoke();
            index = webContent.IndexOf("<div class=\"detName\">");
            // some code here
        }
        catch (WebException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

注意:这样可以正常使用!

     private async void MethodTest(string query)
     {
        try
        {
            var webClient = new WebClient();
            string webContent = string.Empty;
            int index;
            webContent = await webClient.DownloadStringTaskAsync(url);
            index = webContent.IndexOf("<div class=\"detName\">");
            // some code here
        }
        catch (WebException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

1 个答案:

答案 0 :(得分:2)

action.Invoke将立即调用该委托。但是,代理不会立即完成,因为它是异步的。代表将在webClient.DownloadStringTaskAsync返回之前致电MethodTest,但这是您唯一的保证。特别是,在返回之前分配webContent(除非您的HTTP请求真的非常非常快)。

您似乎正在尝试将异步代码包装在同步代码中。我不想说这是注定会失败的,但它肯定不是一件小事。

最佳解决方案是允许您的包含方法为async。我在my MSDN article中将其描述为&#34;一直异步#34;。

如果您完全确定需要从同步代码调用异步代码,那么Stephen Toub has a good overview of the various approaches(直接阻止,阻塞线程池和嵌套的消息循环)。没有&#34;最佳实践&#34;在这种情况下;每种方法都有缺点和缺陷。