【发布时间】:2014-08-05 16:11:18
【问题描述】:
我正在尝试使用返回异步任务的方法。方法是:
public async Task<DataResponse[]> GetGridDataAsync(DataRequest[] requestCollection, object state)
{
return await Task.Factory.FromAsync<DataResponse[]>(BeginGetDataAsync(requestCollection, ar => EndGetDataAsync(ar), state),
EndGetDataAsync);
}
在 Web API 控制器中使用它时,90% 的时间都会出现以下错误:
异步模块或处理程序在异步完成时完成 操作仍在等待中。
我的尝试是:
[HttpGet]
[Route("GetGridDataAsync")]
public IEnumerable<DataResponse> GetGridDataAsync()
{
var proxy = new Proxy();
var task = proxy.GetGridDataAsync(dataRequest, new object());
if (!task.IsCompleted)
{
task.Start();
task.Wait();
}
//var x = (IAsyncResult)task; //i also tried this
//task.Start();
//x.AsyncWaitHandle.WaitOne();
return task.Result;
}
如何在请求完成(或至少指定超时)之前阻塞线程?我将从 Angular 使用这个端点。
这是我上一个问题的后续:Have Web API controller wait for IAsyncResult before completing?
更新 1: 返回 proxy.GetGridDataAsync(dataRequest, new object()) 引发了异常。我可以单步执行 BeginXXX 函数,但 EndXXX 中的断点永远不会被击中。不知道为什么。
有时我没有收到上面的“异步模块或处理程序...”错误,并在堆栈跟踪中收到不同的错误。但我不确定这意味着什么:
{
"Message":"An error has occurred.",
"ExceptionMessage":"Object cannot be null.",
"ExceptionType":"System.ArgumentNullException",
"StackTrace":" at
System.Threading.ThreadPool.RegisterWaitForSingleObjectNative(WaitHandle waitHandle, Object state, UInt32 timeOutInterval, Boolean executeOnlyOnce, RegisteredWaitHandle registeredWaitHandle, StackCrawlMark& stackMark, Boolean compressStack)
at System.Threading.ThreadPool.RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, Object state, UInt32 millisecondsTimeOutInterval, Boolean executeOnlyOnce, StackCrawlMark& stackMark, Boolean compressStack)
at System.Threading.ThreadPool.RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, Object state, Int32 millisecondsTimeOutInterval, Boolean executeOnlyOnce)
at System.Threading.Tasks.TaskFactory`1.FromAsyncImpl(IAsyncResult asyncResult, Func`2 endFunction, Action`1 endAction, TaskCreationOptions creationOptions, TaskScheduler scheduler, StackCrawlMark& stackMark)
at System.Threading.Tasks.TaskFactory.FromAsync[TResult](IAsyncResult asyncResult, Func`2 endMethod)
at proxy.d__1.MoveNext() in proxy.cs:line 30
--- End of stack trace from previous location where exception was thrown ---
}
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
@Hoppe:你确定没有其他异步工作在做吗?如果你是,请发布一个最小的复制。
标签: c# .net asp.net-web-api task-parallel-library async-await