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
。我将其描述为“始终异步”
如果绝对确定需要从同步代码调用异步代码,那么(直接阻塞、线程池阻塞和嵌套消息循环)。在这种情况下没有“最佳实践”;每种方法都有缺点和缺陷。既然我们不能在评论上设置断点,那么当你说“在这里”时,这意味着“在上面一行”还是“在下面一行”?