public class HomeController : Controller
{
public ActionResult Index()
{
Task<string> t = DownloadStringTaskAsync(new Uri("http://www.google.com/search?q=aspnet"));
t.Wait();
string res = t.Result;
return View((object)res);
}
Task<string> DownloadStringTaskAsync(Uri address)
{
TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
WebClient wc = new WebClient();
wc.DownloadStringCompleted += (s, e) => tcs.SetResult(e.Result);
wc.DownloadStringAsync(address);
return tcs.Task;
}
}
该操作将永远不会返回,请求将简单地超时。
我们将 TPL 任务用于所有异步操作,并且必须包装一些 WebClient 的方法,直到我们切换到框架 4.5。
上述方法DownloadStringTaskAsync
是其中一个包装器的简化版本。
我无法弄清楚为什么等待任务会使 aspnet 中的线程死锁并且在控制台或桌面应用程序中工作正常。
这是死锁线程的样子。
请求线程
[处于睡眠、等待或加入]
mscorlib.dll!System.Threading.Monitor.Wait(object obj, int millisecondsTimeout, bool exitContext) + 0x18 bytes mscorlib.dll!System.Threading.ManualResetEventSlim.Wait(int millisecondsTimeout, System .Threading.CancellationToken cancelToken) + 0x264 字节
mscorlib.dll!System.Threading.Tasks.Task.InternalWait(int millisecondsTimeout, System.Threading.CancellationToken cancelToken) + 0x166 字节 mscorlib.dll!System.Threading.Tasks.Task.Wait( int millisecondsTimeout, System.Threading.CancellationToken cancelToken) + 0x41 字节
mscorlib.dll!System.Threading.Tasks.Task.Wait() + 0xb 字节
TCSProblem.DLL!TCSProblem.Controllers.HomeController.Index() 第 16 行 + 0xa 字节WebClient 线程
[在睡眠、等待或加入]
mscorlib.dll!System.Threading.Monitor.Enter(object obj, ref bool lockTaken) + 0x14 字节
System.Web.dll!System.Web.AspNetSynchronizationContext.CallCallback(System.Threading. SendOrPostCallback 回调,对象状态) + 0x53 字节
System.Web.dll!System.Web.AspNetSynchronizationContext.Post(System.Threading.SendOrPostCallback 回调,对象状态) + 0x9 字节
System.dll!System.ComponentModel.AsyncOperation.Post(System. Threading.SendOrPostCallback d,对象 arg) + 0x29 字节
System.dll!System.Net.WebClient.PostProgressChanged(System.ComponentModel.AsyncOperation asyncOp, System.Net.WebClient.ProgressData 进度) + 0x25c 字节