Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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# 关于ASP.NET Web API-异步和等待_C#_.net_Asp.net Mvc_Asp.net Web Api_Async Await - Fatal编程技术网

C# 关于ASP.NET Web API-异步和等待

C# 关于ASP.NET Web API-异步和等待,c#,.net,asp.net-mvc,asp.net-web-api,async-await,C#,.net,Asp.net Mvc,Asp.net Web Api,Async Await,我的AsyncController中有以下异步方法: public async Task<Dashboard> GetFeeds() { var movies = new HttpClient().GetStringAsync("http://netflix/api/MyMovies"); var tweets = new HttpClient().GetStringAsync("http://twitter/api/MyTweets"); await Ta

我的AsyncController中有以下异步方法:

public async Task<Dashboard> GetFeeds()
{
    var movies = new HttpClient().GetStringAsync("http://netflix/api/MyMovies");
    var tweets = new HttpClient().GetStringAsync("http://twitter/api/MyTweets");

    await Task.WhenAll(movies, tweets);

    Dashboard dash = new Dashboard();
    dash.Movies = Deserialize<Movies >(movies.Result);
    dash.Tweets = Deserialize<Tweets >(tweets.Result);

    return dash; 
}
public异步任务GetFeeds()
{
var movies=new HttpClient().GetStringAsync(“http://netflix/api/MyMovies");
var tweets=new HttpClient().GetStringAsync(“http://twitter/api/MyTweets");
等待任务。WhenAll(电影、推特);
仪表板仪表板=新仪表板();
dash.Movies=反序列化(Movies.Result);
dash.Tweets=反序列化(Tweets.Result);
返回短跑;
}
在这个方法中,不同的调用API具有不同的返回时间。关于
任务
我不能理解的是,我必须等待这两个任务的返回来更新我的客户机?因为我正在创建新的线程

想象我在一个PartialView中播放每个API的返回,我认为会得到这样的结果:

-首先,我会有我的电影列表(只需要5秒),->为我的用户显示

-然后我的tweet列表->会为我的用户显示吗

但我看到的是:

-虽然Twitter请求没有结束,但我没有在屏幕上为我的用户播放我从Netflix获得的数据

最大的问题是:
任务
只用于加快处理速度

我不能根据我订购的每个API的周转时间在屏幕上播放信息

这是对我的方法的调用

public async Task<ActionResult> Index()
{
    var feeds = await GetFeeds();

    return View(feeds);
}
公共异步任务索引()
{
var feeds=await GetFeeds();
返回视图(提要);
}

我承认,我很困惑,或者,也许您不理解
任务的概念

ASP.NET MVC的工作方式是,单个控制器操作处理单个HTTP请求,并生成单个HTTP响应。无论操作是同步的还是异步的,都是如此

换句话说(正如我在博客上解释的那样)。要将“初始结果”返回到客户端浏览器并使用其他数据更新页面(或页面的一部分),您需要使用为此设计的技术:AJAX或SignalR


有关更多信息,请参阅的“异步代码不是银弹”部分。

您需要创建两个不同的异步操作。一个用于加载和显示Twitter信息(也称为长时间运行的操作)和一个用于显示Netflix信息(也称为短时间运行的操作)<代码>等待任务.WhenAll(电影、推特)
正在等待它们两个都完成,然后才显示它们。我认为您需要使用async/await对TPL进行更多的研究。很遗憾,我在这方面没有很好的资源。您可以在MSDN的第9频道上查找该模式。它们通常都很好。是的,谢谢你的澄清,我已经用AJAX请求了。我只是想我会回到用户那里,这样每个请求都会结束。我会读你的材料。非常感谢。所以说一个
任务
只是一种更快的请求方式,它启动了一个新线程?@Igao:No.
任务
支持异步处理。它不一定更快,也不会创建新线程。我有一个建议,您可能会发现它很有用。@Igao在处理ASP请求时使用TPL几乎完全是为了使处理请求的线程池线程能够在执行长时间运行的IO绑定操作(通常是数据库或网络调用)时花时间处理其他请求。它可以防止线程池线程在等待IO时需要坐在那里无所事事。由于机器可以支持的线程池线程数量有限制,这意味着在处理请求时增加了吞吐量。每个请求的速度都差不多。