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

C# 为什么只有退出MethodTest时才会触发操作?,c#,asynchronous,task,async-await,webclient,C#,Asynchronous,Task,Async Await,Webclient,action.Invoke()在退出MethodTest之前不会调用“action”操作 private void MethodTest(string query) { try { var webClient = new WebClient(); string webContent = string.Empty; int index; Action

action.Invoke()
在退出MethodTest之前不会调用“action”操作

     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 void方法测试(字符串查询)
{
尝试
{
var webClient=新的webClient();
string webContent=string.Empty;
整数指数;
Action=async委托()
{
webContent=等待webClient.DownloadStringTaskAsync(url);
//在上面添加断点
};
action.Invoke();
index=webContent.IndexOf(“”);
//这里有一些代码
}
捕获(WebException ex)
{
MessageBox.Show(例如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);
        }
    }
private异步void方法测试(字符串查询)
{
尝试
{
var webClient=新的webClient();
string webContent=string.Empty;
整数指数;
webContent=等待webClient.DownloadStringTaskAsync(url);
index=webContent.IndexOf(“”);
//这里有一些代码
}
捕获(WebException ex)
{
MessageBox.Show(例如Message);
}
}

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

看起来您正试图用同步代码包装异步代码。我不想说这是“注定要失败的”,但这肯定不是一个微不足道的努力

最好的解决方案是允许您的包含方法是
async
。我将其描述为“始终异步”


如果绝对确定需要从同步代码调用异步代码,那么(直接阻塞、线程池阻塞和嵌套消息循环)。在这种情况下没有“最佳实践”;每种方法都有缺点和缺陷。

既然我们不能在评论上设置断点,那么当你说“在这里”时,这意味着“在上面一行”还是“在下面一行”?