Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步控制器返回太快_C#_.net_Asp.net Web Api_Model View Controller_Async Await - Fatal编程技术网

C# 异步控制器返回太快

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

这里的想法是同时运行一些长时间运行的方法,每次运行5个。 当其中15个完成时(3块5块),我应该从控制器方法返回

问题是它返回得太早。通常,它在5的第一个块之后返回,但我看到它在第二个块的中间返回

^-我在所有
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);
    });