【发布时间】:2015-04-10 22:24:28
【问题描述】:
我在一个类中创建了一个异步 WebClient 请求,如下所示:
public class Downstream
{
public bool StartDownstream()
{
WebClient client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/4.0 [...]");
client.Headers.Add("Content-Type","application/x-www-form-urlencoded");
try
{
byte[] postArray = Encoding.UTF8.GetBytes("somevar=foo&someothervar=bar");
Uri uri = new Uri("http://www.examplesite.com/somepage.php");
client.UploadDataCompleted +=
new UploadDataCompletedEventHandler(client_UploadDataCompleted);
client.UploadDataAsync(uri, postArray);
}
catch (WebException e)
{
MessageBox.Show("A regular Web Exception");
}
catch (NotSupportedException ne)
{
MessageBox.Show("A super Web Exception");
}
return true;
}
void client_UploadDataCompleted(object sender, UploadDataCompletedEventArgs e)
{
MessageBox.Show("The WebClient request completed");
}
}
然后我创建该类的一个新实例并在此处运行该方法:
Downstream Downstream1 = new Downstream();
Downstream1.StartDownstream();
当我这样做时,表单正在运行的线程似乎挂起,直到 WebClient 得到响应。为什么是这样?我已经使用了UploadDataAsync 方法,所以它不应该是异步的吗?
编辑:
这是我的调用堆栈:
[External Code]
> Arcturus.exe!Arcturus.Downstream.StartDownstream() Line 36 + 0x18 bytes C#
Arcturus.exe!Arcturus.MainWindow.btnLogin_Click(object sender, System.Windows.RoutedEventArgs e) Line 111 + 0x12 bytes C#
[External Code]
这就是我运行应用程序时发生的所有事情,只是挂在 StartDownstream() 和 client.UploadDataAsync(uri, postArray); 方法上。
【问题讨论】:
-
你可以在 UploadDataAsync 之前/之后设置一个断点来检查它实际上是阻塞调用 - 但是,根据 MSDN,这不会阻塞 - 你可能必须在其他地方阻塞?
-
我已经测试过了,不幸的是这是阻塞调用线程的代码。
-
在阻塞时使用 Debug + Break All 并复制调用堆栈。这样做几次,发布重复最好的那个。
-
我已经在上面发布了我的调用堆栈。那是你想看到的吗?信息似乎不够!
标签: c# multithreading asynchronous webclient