小编Joe*_*ger的帖子

页面打开的网络套接字数量是否存在限制(实际或其他)?

我们非常喜欢带有Web套接字的异步模型.在我们的一些应用程序中,我们在框架中实现小部件(通常在页面上多达10或20个小部件).每个小部件打开一个Web套接字,以接收状态更改的通知.

是否有任何最佳实践,实际限制或对页面可以打开的Web套接字数量的硬限制?

websocket

13
推荐指数
1
解决办法
1万
查看次数

ToArray()可以抛出异常吗?

虽然这个问题的答案非常好,但它意味着您应该锁定对List.ToArray()的锁定以进行并发. 这篇博文还暗示它可能会灾难性地失败(但很少).在枚举列表或其他集合时,我通常使用ToArray而不是锁定,以避免"Collection Modified,Enumeration may not completed"异常.这个答案和博客文章都对这个假设提出质疑.

List.ToArray()的文档没有列出任何异常,所以我一直认为它总是会完成(虽然可能是陈旧的数据),虽然从数据一致性的角度来看它不是线程安全的,但它是线程从代码执行的角度来看是安全的 - 换句话说,它不会抛出异常并且调用它不会破坏底层集合的内部数据结构.

如果这个假设不正确,那么虽然它从未引起过问题,但它可能是高可用性应用程序中的定时炸弹.什么是明确的答案?

c# collections multithreading locking

9
推荐指数
2
解决办法
2751
查看次数

使用PLINQ Extensions时是否传输了线程标识?

我正在使用.AsParallel().ForAll()在ASP.NET请求的上下文中并行枚举一个集合.枚举方法依赖于System.Threading.Thread.CurrentPrincipal.

我可以依赖于用于将System.Threading.Thread.CurrentPrincipal设置为处理ASP.NET请求的线程的HttpContext.Current.User的单个线程,还是我需要自己管理?

问这个问题的另一种方法是PLINQ使用的线程是否继承了调用该操作的线程的标识?

c# asp.net multithreading plinq

8
推荐指数
1
解决办法
2686
查看次数

在MongoDB中存储小整数的方法

我正在尝试为包含大量文档的集合优化数据库大小.文档具有许多由小整数(<255)表示的属性.在SQL Server世界中,这些将存储为tinyint值,但我能找到的最小的BSON类型是Int32.

有没有办法在MongoDB中有效存储小整数?

mongodb

7
推荐指数
1
解决办法
938
查看次数

使用Reflection.Emit覆盖属性定义

我正在尝试使用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)

c# reflection.emit

6
推荐指数
1
解决办法
5294
查看次数

使用DOM元素作为javascript map的键

我试图将一些"私有"数据与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元素.

javascript

6
推荐指数
1
解决办法
3221
查看次数

"当前"属性与ExecutionContext一起流动

这是一个两部分问题:

  1. 有人可以提供ASP.NET/.NET属性的列表,这些属性通常是与ExecutionContext一起流动的线程本地吗?

    HttpContext.Current?Thread.CurrentContext?Thread.CurrentPrincipal中?Thread.CurrentCulture?

    我可以依靠什么属性来存活/持续异步/等待?

    还有什么?

  2. 有没有办法添加将使用ExecutionContext自动流动的特定于应用程序的上下文信息?就像是

    var ec = ExecutionContext.Capture();
    ec.CustomContext["MyCustomContext"] = ACustomContext;
    
    Run Code Online (Sandbox Code Playgroud)

.net multithreading async-await

6
推荐指数
1
解决办法
2134
查看次数

提高从MethodCallExpression获取MethodInfo的性能

我们的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)

c# reflection expression

5
推荐指数
1
解决办法
1437
查看次数

使用ng-controller注入所需的依赖项

使用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或重构我们的代码以使用继承范围的自定义指令之外,是否有任何开箱即用的方法可以做到这一点?

angularjs angular-ui-router

5
推荐指数
1
解决办法
2208
查看次数

为什么不同版本的.net(或编译器)为同一个表达式生成不同的表达式树

在我的一个库中,我有从表达式返回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# expression-trees system.reflection

5
推荐指数
1
解决办法
97
查看次数