C# 异步控制器返回太快
这里的想法是同时运行一些长时间运行的方法,每次运行5个。 当其中15个完成时(3块5块),我应该从控制器方法返回 问题是它返回得太早。通常,它在5的第一个块之后返回,但我看到它在第二个块的中间返回 ^-我在所有C# 异步控制器返回太快,c#,.net,asp.net-web-api,model-view-controller,async-await,C#,.net,Asp.net Web Api,Model View Controller,Async Await,这里的想法是同时运行一些长时间运行的方法,每次运行5个。 当其中15个完成时(3块5块),我应该从控制器方法返回 问题是它返回得太早。通常,它在5的第一个块之后返回,但我看到它在第二个块的中间返回 ^-我在所有return语句中都有断点,但这些断点不会被命中。我知道它会返回,因为我从Javascript调用它,并且在浏览器中有一个断点。返回数据是一个空字符串。根据关于另一个问题的建议,我添加了一个覆盖void Dispose(…)来查看这是否被击中,但它没有。 然后我在Global.asax.c
return
语句中都有断点,但这些断点不会被命中。我知道它会返回,因为我从Javascript调用它,并且在浏览器中有一个断点。返回数据是一个空字符串。根据关于另一个问题的建议,我添加了一个覆盖void Dispose(…)
来查看这是否被击中,但它没有。
然后我在Global.asax.cs中的所有事件中设置断点,例如Application\u Error
、Session\u End
和Application\u End
,但是这些也不会在过早返回中被命中。我还在OnActionExecuted
事件的ActionFilterAttribute
中添加了一个断点,但也没有命中!我还安装了elmah,它通常会捕获错误。我找不到代码返回到getJson()
调用的位置
LongRunning方法每运行一个块中的每个项目大约需要30秒。
我可以将块计数从5增加(或减少)到10,10完成后它仍然会返回
我已经尽可能地精简了代码,以清晰地表达这个问题:
[HttpGet]
[Route("TestAPI/RunTest")]
public async Task<IHttpActionResult> RunTest(bool reload, DateTime period)
{
if (reload)
{
await BuildNewDataTest(period);
// Also tried:
// await BuildNewDataTest(period).ContinueWith((x) => { results = _myUoW.GetDataTest(period); });;
}
return Ok(_myUoW.GetDataTest(period));
// return Ok(results);
}
private async Task<bool> BuildNewDataTest(DateTime period)
{
// DoSomeStuff...
DateTime oldDate = DateTime.Now.AddDays(-30);
AddStuffToDatabase();
List<Task> concurrentRuns = new List<Task>();
for (int i = 0; i < 15; i += 5)
{
concurrentRuns.Clear();
List<MyType> block = fullList
.Skip(i)
.Take(5).ToList();
block.ForEach(x => concurrentRuns.Add(RunStuffAsync(period, oldDate, x.IsOpen)));
await Task.WhenAll(concurrentRuns);
}
return true;
}
private async Task<bool> RunStuffAsync(DateTime period, DateTime prevDate, bool isOpen)
{
// DoSomeStuff...
await Task.Run(() =>
{
_myUoW.RunSomeLongRunningProcess(longRunningID, period);
return true;
});
return false;
}
private void AddStuffToDatabase()
{
_myUoW.CreateNewEntry(...);
}
感谢您的帮助。是
RunSomeLongRunningProcess()
async吗?不应该是吗?我刚刚将其更改为async
,还将调用更改为Wait Task.Run(async()=>{u myUoW.RunSomeLongRunningProcessAsync(longRunningID,句点);返回true;})代码>但仍然很早返回。是否检查了所有可能的超时;可能还有更多的事情会超时。@grek40超时是问题所在-使用RestSharp调用我的WebAPI控制器方法。我确信我会在某个地方出现超时错误。。我这方面的愚蠢疏忽。谢谢-如果你想添加答案,我会接受。
$.getJSON('TestAPI/RunTest', { reload: self.reload(), period: self.period() }, function (data) {
var myData = JSON.parse(data);
self.myReturnedData(myData);
createDataTable(myData);
});