首页 / C# / c#并行IO完成端口
c#并行IO完成端口
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#并行IO完成端口,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2348字,纯文字阅读大概需要4分钟。
内容图文
我正在试图找出等待一些I / O完成端口完成的最佳方法.
对于这种情况,让我们说我在一个MVC3网络应用程序中. (我的理解是建议使用I / O完成端口,因此我可以将原始线程返回给IIS来为其他请求提供服务)
假设我有一系列ID,我想从某个网络调用中获取每个ID的对象.
并行化这种同步方法的最佳方法是什么?
public class MyController: Controller
{
public ActionResult Index(IEnumerable<int> ids)
{
ids.Select(id => _context.CreateQuery<Order>("Orders")
.First(o => o.id == id));
DataServiceQuery<Order> query = _context.CreateQuery<Order>("Orders");
return Json(query);
}
private DataServiceContext _context; //let's ignore how this would be populated
}
我知道它会像这样开始:
public class MyController: AsyncController
{
public void IndexAsync(IEnumerable<int> ids)
{
// magic here...
AsyncManager.Sync(() => AsyncManager.Parameters["orders"] = orders);
}
public ActionResult IndexCompleted(IEnumerable<Order> orders)
{
return Json(orders);
}
private DataServiceContext _context; //let's ignore how this would be populated
}
我应该使用DataServiceContext.BeginExecute方法吗? DataServiceContext.BeginExecuteBatch?我正在使用的数据服务一次只能获得一条记录(这超出了我的控制范围),我希望这些单独的查询并行运行.
解决方法:
这是我最终用于在MVC3中运行一批异步操作的模式:
public class MyController: AsyncController
{
public void IndexAsync(int[] ids)
{
var orders = new Orders[ids.Length];
AsyncManager.Parameters["orders"] = orders;
// tell the async manager there are X operations it needs to wait for
AsyncManager.OutstandingOperations.Increment(ids.Length);
for (int i = 0; i < ids.Length; i++){
var index = i; //<-- make sure we capture the value of i for the closure
// create the query
var query = _context.CreateQuery<Order>("Orders");
// run the operation async, supplying a completion routine
query.BeginExecute(ar => {
try {
orders[index] = query.EndExecute(ar).First(o => o.id == ids[index]);
}
catch (Exception ex){
// make sure we send the exception to the controller (in case we want to handle it)
AsyncManager.Sync(() => AsyncManager.Parameters["exception"] = ex);
}
// one more query has completed
AsyncManager.OutstandingOperations.Decrement();
}, null);
}
}
public ActionResult IndexCompleted(Order[] orders, Exception exception)
{
if (exception != null){
throw exception; // or whatever else you might like to do (log, etc)
}
return Json(orders);
}
private DataServiceContext _context; //let's ignore how this would be populated
}
内容总结
以上是互联网集市为您收集整理的c#并行IO完成端口全部内容,希望文章能够帮你解决c#并行IO完成端口所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。