我们非常喜欢带有Web套接字的异步模型.在我们的一些应用程序中,我们在框架中实现小部件(通常在页面上多达10或20个小部件).每个小部件打开一个Web套接字,以接收状态更改的通知.
是否有任何最佳实践,实际限制或对页面可以打开的Web套接字数量的硬限制?
虽然这个问题的答案非常好,但它意味着您应该锁定对List.ToArray()的锁定以进行并发. 这篇博文还暗示它可能会灾难性地失败(但很少).在枚举列表或其他集合时,我通常使用ToArray而不是锁定,以避免"Collection Modified,Enumeration may not completed"异常.这个答案和博客文章都对这个假设提出质疑.
List.ToArray()的文档没有列出任何异常,所以我一直认为它总是会完成(虽然可能是陈旧的数据),虽然从数据一致性的角度来看它不是线程安全的,但它是线程从代码执行的角度来看是安全的 - 换句话说,它不会抛出异常并且调用它不会破坏底层集合的内部数据结构.
如果这个假设不正确,那么虽然它从未引起过问题,但它可能是高可用性应用程序中的定时炸弹.什么是明确的答案?
我正在使用.AsParallel().ForAll()在ASP.NET请求的上下文中并行枚举一个集合.枚举方法依赖于System.Threading.Thread.CurrentPrincipal.
我可以依赖于用于将System.Threading.Thread.CurrentPrincipal设置为处理ASP.NET请求的线程的HttpContext.Current.User的单个线程,还是我需要自己管理?
问这个问题的另一种方法是PLINQ使用的线程是否继承了调用该操作的线程的标识?
我正在尝试为包含大量文档的集合优化数据库大小.文档具有许多由小整数(<255)表示的属性.在SQL Server世界中,这些将存储为tinyint值,但我能找到的最小的BSON类型是Int32.
有没有办法在MongoDB中有效存储小整数?
我正在尝试使用Reflection.Emit(TypeBuilder)实现此模式:
public class ClassToBeProxied
{
public virtual object Property1 { get; set; }
}
public class Proxy : ClassToBeProxied
{
[AttributeToBeAdded]
public override object Property1
{
get
{
//do something else to return the object - i.e get it from the database
return null; //stub
}
set
{
//do something else to set the object - i.e, save it to a database
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我所做的只是拦截get和set方法,那么这有效:
PropertyInfo info = typeof(ClassToBeProxied).GetProperty("Property1", BindingFlags.Public | BindingFlags.Instance);
{
MethodBuilder pGet = typeBuilder.DefineMethod("get_" + info.Name, …Run Code Online (Sandbox Code Playgroud) 我试图将一些"私有"数据与DOM元素相关联.而不是将该数据添加到DOM元素本身(我想避免更改DOM元素),我有一个单独的数据对象,我想用作地图.
而不是:
document.GetElementById('someElementId').privateData = {};
Run Code Online (Sandbox Code Playgroud)
我想要做
internalPrivateDataMap[document.GetElementById('someElementId')].privateData = {};
Run Code Online (Sandbox Code Playgroud)
并非所有元素都有id字段,有些是动态创建的,所以我不能使用id作为键.
这适用于大多数元素,但对于"a"元素,使用的键似乎是元素的href,我认为因为DOM为元素定义了toString()函数.
结果是,如果我有两个具有相同href的"a"元素,它们将共享privateData,这是我不想要的.
我目前的解决方法是生成一个我可以用作键的内部唯一ID,但这需要我修改我要避免的DOM元素.
这是一个两部分问题:
有人可以提供ASP.NET/.NET属性的列表,这些属性通常是与ExecutionContext一起流动的线程本地吗?
HttpContext.Current?Thread.CurrentContext?Thread.CurrentPrincipal中?Thread.CurrentCulture?
我可以依靠什么属性来存活/持续异步/等待?
还有什么?
有没有办法添加将使用ExecutionContext自动流动的特定于应用程序的上下文信息?就像是
var ec = ExecutionContext.Capture();
ec.CustomContext["MyCustomContext"] = ACustomContext;
Run Code Online (Sandbox Code Playgroud)我们的UI系统可以从MethodInfo生成表单.在System.Linq.Expressions之前,我们使用反射获得MethodInfo(方法1):
MethodInfo info = typeof(ExtensionTestClass).GetMethod("InstanceMethod", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(string), typeof(string) }, null);
Run Code Online (Sandbox Code Playgroud)
关于这一点的不好的部分是,如果我们更改了InstanceMethod的签名或名称,代码仍然会编译.
输入表达式.现在我们这样做(方法2):
MethodInfo info = GetMethod<ExtensionTestClass>(x => x.InstanceMethod("defaultValue", "defaultValue"));
Run Code Online (Sandbox Code Playgroud)
或者这个(方法3):
MethodInfo info = GetMethod<ExtensionTestClass, string, string>(x => x.InstanceMethod);
Run Code Online (Sandbox Code Playgroud)
语法是"更好",我们得到intellisense,如果方法不存在或签名不匹配,我们会得到编译错误.然而,方法2和方法3比反射慢约10至20倍.
一些数字(用StopWatch测量):
单次呼叫:方法1:.0000565方法2:.0004272方法3:.0019222
100000呼叫:方法1:.1171071方法2:1.5648544方法3:2.0602607
我们实际上并没有编译表达式或执行它,我很感兴趣,如果有人对性能的差异有解释.
更新:GetMethod <>代码:
方法2:
public static MethodInfo GetMethod<T>(Expression<Action<T>> target)
{
MethodCallExpression exp = target.Body as MethodCallExpression;
if (exp != null)
{
return exp.Method;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
方法3:
public static MethodInfo GetMethod<T, A1, A2>(Expression<Func<T, Action<A1, A2>>> expression)
{
var lambdaExpression = (LambdaExpression)expression; …Run Code Online (Sandbox Code Playgroud) 使用ui.router,我们有一个状态控制器:
controller('widget', function($repository, $stateParams){
$scope.widget = $repository.get($stateParams.id);
})
Run Code Online (Sandbox Code Playgroud)
注册时间:
.state('widget',
controller: 'widget',
template: '/widgetTemplate.html'
Run Code Online (Sandbox Code Playgroud)
我们遇到了一个案例,我们希望将此控制器作为模板的一部分重用:
<div ng-controller="widget" ng-include="/widgetTemplate.html"></div>
Run Code Online (Sandbox Code Playgroud)
但似乎没有一种简单的方法可以使用正确的ID注入模拟的$ stateParams对象.就像是:
<div ng-controller="widget" ng-inject="{$stateParams: {id: 1234}}" ng-include="/widgetTemplate.html"></div>
Run Code Online (Sandbox Code Playgroud)
除了编写增强ng-controller或重构我们的代码以使用继承范围的自定义指令之外,是否有任何开箱即用的方法可以做到这一点?
在我的一个库中,我有从表达式返回MethodInfo的代码:
public MethodInfo GetMethod(Expression expression)
{
var lambdaExpression = (LambdaExpression)expression;
var unaryExpression = (UnaryExpression)lambdaExpression.Body;
var methodCallExpression = (MethodCallExpression)unaryExpression.Operand;
var methodInfoExpression = (ConstantExpression)methodCallExpression.Arguments.Last();
return (MethodInfo)methodInfoExpression.Value;
}
Run Code Online (Sandbox Code Playgroud)
我有一系列辅助函数来启用如下调用:
public MethodInfo Func<T, R, A1>(Expression<Func<T, Func<A1, R>>> expression)
{
return GetMethod(expression);
}
Run Code Online (Sandbox Code Playgroud)
这将启用以下语法:
var methodInfo = Func<TestClass, bool, string>(x => x.AnInstanceMethodThatTakesAStringAndReturnsABool);
Run Code Online (Sandbox Code Playgroud)
这很好用,直到我最近将库升级到.Net 4.6.1和最新的c#编译器.
在.net的早期版本中,表达式将采用以下形式:
{x => Convert(CreateDelegate(System.Func`2[System.String, System.Boolean], x, Boolean AnInstanceMethodThatTakesAStringAndReturnsABool(System.String)))}
Run Code Online (Sandbox Code Playgroud)
因此,我的代码会将methodInfoExpression作为methodCallExpression的最后一个参数.
现在,在.Net 4.6.1(最新的c#编译器)中,编译器似乎正在生成一个不同形式的表达式:
{x => Convert(Boolean AnInstanceMethodThatTakesAStringAndReturnsABool(System.String).CreateDelegate(System.Func`2[System.String, System.Boolean], x))}
Run Code Online (Sandbox Code Playgroud)
我当前的代码中断,因为最后一个参数不是ConstantExpression.看着它 - 轻松修复,只需改为
var methodInfoExpression = (ConstantExpression)methodCallExpression.Object;
Run Code Online (Sandbox Code Playgroud)
显然,GetMethod函数非常脆弱,并且可能会改变编译器生成表达式的方式.我很好奇这个更改的原因以及我如何重构GetMethod,以便它对编译器生成的表达式树更具弹性.
c# ×5
.net ×1
angularjs ×1
asp.net ×1
async-await ×1
collections ×1
expression ×1
javascript ×1
locking ×1
mongodb ×1
plinq ×1
reflection ×1
websocket ×1