c# - 异步方法不返回

标签 c# .net asp.net-mvc async-await

我有以下使用 Scanner 类的 Action 方法,该类使用一些网络服务来获取一些数据。当我在 GetSuggestions 方法中使用断点时,我可以看到结果。但是,此数据永远不会返回到我的 Action 方法。相反,当我在 Index() 中检查 model 的值时,它是,

Id = 1, Status = System.Threading.Tasks.TaskStatus.WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"

我检查了this问题,但这对我没有帮助。

Controller 操作方法:

[HttpGet]
public ActionResult Index()
{
    var plane = new Scanner();
    var model = plane.GetSuggestions("ISTANBUL");

    return View(model);
}

GetSuggestions 方法:

public async Task<List<PlaceDto>> GetSuggestions(string key)
{
    string url = String.Format("URL GOES HERE", key, API_KEY);

    string data = await RequestProvider.Get(url);

    return JObject.Parse(data).SelectToken("Places").ToObject<List<PlaceDto>>();
}

RequestProvider 方法:

public static async Task<string> Get(string url)
{
    using (var client = new HttpClient())
    {
        return await client.GetStringAsync(url);
    }
}

编辑 1

我还尝试用任务包装 Action 方法并等待 GetSuggestions 方法,但我在 client.GetStringAsync(url)

上收到异常

在操作方法上使用任务时出现异常

System.NullReferenceException was unhandled
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=System.Web
  StackTrace:
       at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext)
       at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext)
       at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state)
       at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state)
       at System.Web.LegacyAspNetSynchronizationContext.Post(SendOrPostCallback callback, Object state)
       at System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.PostAction(Object state)
       at System.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback callback, Object state, Task& currentTask)
    --- End of stack trace from previous location where exception was thrown ---
       at System.Threading.Tasks.AwaitTaskContinuation.<ThrowAsyncIfNecessary>b__1(Object s)
       at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
       at System.Threading.ThreadPoolWorkQueue.Dispatch()
       at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
  InnerException: 

编辑2

我从 await client.GetStringAsync(url); 中删除了 await 关键字,代码可以正常工作。但是,我认为这将同步运行而不是异步运行。以下是更新后的 Get 方法,

public static async Task<string> Get(string url)
{
    using (var client = new HttpClient())
    {
        return client.GetStringAsync(url).Result;
    }  
}

最佳答案

您的问题分为两部分。

首先是僵局。您需要更换任何 Task.WaitTask<T>.Resultawait 打电话.我更全面地解释了这种死锁情况 on my blogin the answer you linked to .

第二个是异常(exception)。您看到此异常是因为您正在使用 async/await在 ASP.NET 4.0 上,这是不受支持的。您需要确保您的目标是 .NET 4.5 并且 you have set <httpRuntime targetFramework="4.5" /> in your web.config .

关于c# - 异步方法不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548285/

相关文章:

c# - 运行时禁用 datagridviewcombobox

C# 传递列表参数

c# - 如何在另一个 ASP.NET MVC 项目中运行 ASP.NET MVC 项目

jquery - 使用 jquery 访问 twitter bootstrap modal-body 内容

c# - #if 预处理器指令并不总是崩溃

c# - RDLC报表中心如何显示报表数据?

.net - 如何强制 WPF 使用使用程序集强名称的资源 URI?啊!

c# - 如何使用可能的空列表处理此 LINQ 代码中的空值?

c# - .NET 中 PadLeft() 和 PadRight() 的 R 等价物是什么?

.net - 何时解决托管堆碎片问题