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);
}
}
答案 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;在这种情况下;每种方法都有缺点和缺陷。