小编Ang*_*nov的帖子

ASP.NET MVC中的WebClient死锁(同步动作方法)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

该操作永远不会返回,请求将暂停.

我们正在为所有异步操作使用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 cancellationToken)+ 0x264 bytes
mscorlib.dll!System.Threading.Tasks.Task.InternalWait(int millisecondsTimeout,System.Threading.CancellationToken cancellationToken)+ 0x166 bytes mscorlib.dll!System.Threading.Tasks.Task.Wait( int millisecondsTimeout,System.Threading.CancellationToken cancellationToken)+ 0x41 bytes …

c# asp.net-mvc asynchronous task-parallel-library

2
推荐指数
1
解决办法
1464
查看次数