【发布时间】:2014-10-22 06:51:01
【问题描述】:
我有以下使用Scanner 类的Action 方法,该类使用一些网络服务来获取一些数据。当我在GetSuggestions 方法中使用断点时,我可以看到结果。但是,这些数据永远不会返回到我的 Action 方法。相反,当我在Index() 中检查model 的值时,它是,
Id = 1, Status = System.Threading.Tasks.TaskStatus.WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"
我检查了this 问题,但它没有帮助我。
控制器动作方法:
[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;
}
}
【问题讨论】:
-
GetSuggestions的返回类型为Task,您必须调用.Result才能获得所需的List<PlaceDto>。 -
内部异常堆栈跟踪是什么?
-
@MarcelN。内部异常为空。
-
@emrenevayeshirazi:除了 Jason 的回答之外,您还需要将操作签名更改为
public async Task<ActionResult> Index()。不确定你是否已经这样做了。 -
@MarcelN。谢谢,但我已经尝试过了。请参阅我的 1. 和 2. 编辑。
标签: c# .net asp.net-mvc async-await