我正在使用完全异步的API客户端,也就是说,每个操作都返回Task或者Task<T>,例如:
static async Task DoSomething(int siteId, int postId, IBlogClient client)
{
await client.DeletePost(siteId, postId); // call API client
Console.WriteLine("Deleted post {0}.", siteId);
}
Run Code Online (Sandbox Code Playgroud)
使用C#5 async/await运算符,启动多个任务并等待它们全部完成的正确/最有效方法是什么:
int[] ids = new[] { 1, 2, 3, 4, 5 };
Parallel.ForEach(ids, i => DoSomething(1, i, blogClient).Wait());
Run Code Online (Sandbox Code Playgroud)
要么:
int[] ids = new[] { 1, 2, 3, 4, 5 };
Task.WaitAll(ids.Select(i => DoSomething(1, i, blogClient)).ToArray());
Run Code Online (Sandbox Code Playgroud)
由于API客户端在内部使用HttpClient,我希望这会立即发出5个HTTP请求,并在每个请求完成时写入控制台.
我在本节中定义了此部分 _Layout.cshtml
@RenderSection("Scripts", false)
Run Code Online (Sandbox Code Playgroud)
我可以从视图中轻松使用它:
@section Scripts {
@*Stuff comes here*@
}
Run Code Online (Sandbox Code Playgroud)
我正在努力的是如何从局部视图中获取本节内注入的一些内容.
我们假设这是我的视图页面:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
Run Code Online (Sandbox Code Playgroud)
我需要Scripts从_myPartial局部视图中注入部分内容.
我怎样才能做到这一点?
在这个问题之后,在ASP.NET MVC中使用异步操作时,我感到很舒服.所以,我写了两篇博文:
我对ASP.NET MVC上的异步操作有太多的误解.
我总是听到这句话:如果操作异步运行,应用程序可以更好地扩展
我也听到了很多这样的句子:如果你有大量的流量,你可能最好不要异步执行查询 - 消耗2个额外的线程来为一个请求提供服务会使资源远离其他传入的请求.
我认为这两句话是不一致的.
我没有太多关于threadpool如何在ASP.NET上工作的信息,但我知道线程池的线程大小有限.所以,第二句话必须与这个问题有关.
我想知道ASP.NET MVC中的异步操作是否在.NET 4上使用ThreadPool中的线程?
例如,当我们实现AsyncController时,应用程序结构如何?如果我获得巨大的流量,实现AsyncController是一个好主意吗?
有没有人可以在我眼前取下这个黑色的窗帘并向我解释ASP.NET MVC 3(NET 4)上有关异步的处理?
编辑:
我已经阅读了下面这个文件近几百次,我理解主要的交易,但我仍然感到困惑,因为那里有太多不一致的评论.
编辑:
让我们假设我有如下控制器动作(AsyncController虽然不是实现):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Run Code Online (Sandbox Code Playgroud)
正如你在这里看到的那样,我开始操作并忘掉它.然后,我立即返回而不等待它完成.
在这种情况下,这是否必须使用来自线程池的线程?如果是这样,在完成之后,该线程会发生什么?GC完成后会进来清理吗?
编辑:
对于@ Darin的回答,这里是一个与数据库对话的异步代码示例:
public class FooController : AsyncController {
//EF 4.2 DbContext instance
MyContext _context = new MyContext();
public void IndexAsync() { …Run Code Online (Sandbox Code Playgroud) 今天参加了一个关于REST的有趣演示,但是,我想不出一个原因(也没有提到)为什么REST比基于SOAP的服务堆栈更好或更简单地使用和实现.
是什么原因导致"真实世界"中的任何人使用REST而不是基于SOAP的服务?
在ASP.NET MVC中,我们有@Url.Action行动.有类似的东西@Url.Api会路由到/ api/controller吗?
IMO是TypeScript语言的主要关注点之一,它支持现有的vanilla JavaScript代码.这是我乍一看的印象.看一下完全有效的以下JavaScript函数:
注意:我不是说我喜欢这种方法.我只是说这是一个有效的JavaScript代码.
function sum(numbers) {
var agregatedNumber = 0;
for(var i = 0; i < arguments.length; i++) {
agregatedNumber += arguments[i];
}
return agregatedNumber;
}
Run Code Online (Sandbox Code Playgroud)
因此,我们使用任意数量的参数来使用此函数:
console.log(sum(1, 5, 10, 15, 20));
Run Code Online (Sandbox Code Playgroud)
但是,当我使用TypeScript Playground尝试此操作时,它会产生编译时错误.
我假设这是一个错误.我们假设我们没有兼容性问题.那么,有没有办法用开放式参数编写这种类型的函数?如paramsC#中的功能?
几个月前有人问我这个问题,我无法详细解释.C#中的引用类型和值类型有什么区别?
我知道,价值类型int,bool,float,等和引用类型delegate,interface等等.或者,这是不对的,太?
你能以专业的方式向我解释一下吗?
在我的ASP.NET MVC应用程序上,我正在尝试实现如下的URL:
/产品/标签/为+家庭
当我尝试使用默认配置运行我的应用程序时,我收到404.11响应代码的消息:
HTTP错误404.11 - 未找到
请求过滤模块被配置为拒绝包含双转义序列的请求.
我可以通过在web.config中实现以下代码来解决此错误:
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
所以,现在我没有得到任何404.11.
我想知道的是,我正在用这种实现打开什么样的安全漏洞.
顺便说一句,我的应用程序正在.Net Framework 4.0运行IIS 7.5.
正如标题所说,我从GET请求到IQueryable操作有500个内部服务器错误.错误的主体是空的.我的操作返回结果后发生该错误.
我使用ASP.NET Web API RC.
如何获得该错误的堆栈跟踪?
使用新的ASP.NET Web API测试版.我似乎无法获得建议的用户身份验证方法.建议的方法似乎是,将[Authorize]过滤器添加到API控制器.例如:
[Authorize]
public IEnumerable<Item> Get()
{
return itemsService.GetItems();
}
Run Code Online (Sandbox Code Playgroud)
但这并不像预期的那样有效.请求资源时,您将被重定向到登录表单.哪个不适合RESTful webapi.
我该怎么办呢?它在未来的版本中会有不同的工作吗?或者我应该回到实现我自己的动作过滤器?
.net ×3
asp.net-mvc ×3
c# ×3
asp.net ×2
rest ×2
async-await ×1
asynchronous ×1
c#-5.0 ×1
iis ×1
iis-7 ×1
javascript ×1
razor ×1
typescript ×1
value-type ×1
web-services ×1