小编Duk*_*Cat的帖子

MongoDB C#驱动程序类型鉴别器,泛型类继承自非泛型基类

我正在尝试使用官方C#驱动程序存储从mongodb中的非泛型基类继承的泛型类的对象列表.

我的代码看起来像这样:

abstract class MyAbstractClass {}

class MyGenericClass<T>: MyAbstractClass
{
    [BsonRequired]
    public List<T> Values = new List<T>();

    public MyGenericClass(IEnumerable<T> values) 
    {
        Values.AddRange(values);
    }
}

class MyContainerClass
{
    [BsonId]
    public string Id;

    [BsonRequired]
    public List<MyAbstractClass> ValueCollections = new List<MyAbstractClass>();

    public MyContainerClass()
    {
        Id = Guid.NewGuid().ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

在测试时,我创建了一个容器对象并用泛型类的实例填充它,如下所示:

var container = new MyContainerClass();
container.ValueCollections.Add(new MyGenericClass<string>(new[]{"foo","bar","baz"}));
Run Code Online (Sandbox Code Playgroud)

当我将其保存到数据库时,添加的文档如下所示:

{
"_id": "c5cf5cd1-843f-4d5d-ba8f-5859ae62fd1d",
"ValueCollections": [
    {
        "_t": "MyGenericClass`1",
        "Values": [
            "foo",
            "bar",
            "baz"
        ]
    }
]
}
Run Code Online (Sandbox Code Playgroud)

类型鉴别器获取类型"MyGenericClass'1"而不是"MyGenericClass'1 [System.String]",这意味着它不能再次反序列化.

此外,当尝试从数据库加载这些对象时,我收到一条错误消息:无法创建抽象类的实例.但是类型鉴别器(如果它是正确的)应该允许驱动程序看到它不应该创建MyAbstractClass类型的对象但是MyGenericClass

所以我的问题是:1.为什么我会收到此错误?2.为什么不正确地序列化鉴别器?

感谢您的时间.

.net c# generics inheritance mongodb

6
推荐指数
2
解决办法
4259
查看次数

将自引用传递给包含对象的函数

我正在尝试理解 Rust 的所有权模型。我试图在结构体上调用函数时传递对包含对象的引用。

这是我的结构:

pub struct Player {}

impl Player {
    pub fn receive(self, app: &App) {

    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,receive需要一个对象的引用App

pub struct App {
    pub player: Player,
}

impl App {
    pub fn sender(self) {
        // how to call player.test() and pass self as a reference?
        self.player.receive(&self);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我“使用部分移动的值:self”。这是有道理的,因为App具有移动语义,因此该值sender在调用函数时被移动到函数中。

如果我更改它以便sender需要引用self,我会得到“无法移出借用的内容”,这也是有道理的,因为我们self在进入sender函数时借用了引用。

那我该怎么办?App我明白为什么我不能存储对inside 的引用Player,因为这会导致双向链接结构。但我应该能够借用一个引用并对其执行操作,不是吗?

我在官方教程中没有找到答案。

我通过self作为参考传递来解决它receive …

reference rust borrowing

5
推荐指数
2
解决办法
7646
查看次数

卡在GCFrame中的线程数量过多会导致CPU使用率升高

我们有一个使用Kestrel来服务HTTP请求的应用程序。过去,我们遇到了一些问题,其中高负载导致线程池产生了数千个线程,这时我们将得到锁定队列现象。在大多数情况下,线程会Monitor.Enter()在代码中的某个位置开始相互阻塞,从而导致延迟和更多争用,直到由于上下文切换导致应用程序对100%CPU使用率无响应为止。在重新启动应用程序之前,问题不会消失。

但是,我们消除了大多数锁并实现了限制机制,以使我们不允许超过1000个线程进入该应用程序。我们使用System.Threading.Semaphore该类仅允许一定数量的线程继续。这就解决了我们的锁争用问题,但是可能引入了一个新问题:

我们仍然会遇到100%CPU使用率和高线程数(500-1000个线程)的情况,尽管这次线程并未被阻塞Monitor.Enter()。相反,当我们使用(Microsoft.Diagnostics.Runtime.ClrRuntime)进行线程转储时,我们看到以下调用堆栈(用于数百个线​​程):

thread id = 892
  GCFrame
  GCFrame
  HelperMethodFrame
  System.Threading.TimerQueueTimer.Fire()
  System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
  System.Threading.ThreadPoolWorkQueue.Dispatch()
  DebuggerU2MCatchHandlerFrame
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该问题会使应用程序变得无响应,但在大多数情况下,几分钟后它便会解决。有时需要几个小时。

这样的调用栈是什么意思?这是Kestrel的已知问题,还是Kestrel的某种组合而Semaphore导致了这一问题?

更新:内存转储显示HelperMethodFrame调用栈中的Monitor.Enter()毕竟可能是对的调用。但是,我们仍然无法确定这是在我们的代码中还是在Kestrel或其他库中。当我们之前遇到锁车队问题时,我们将在调用堆栈中看到我们的代码。现在,它似乎是一个Monitor.Enter()内部调用TimerQueueTimer,而我们的代码中并未使用该调用。内存转储如下所示:

.NET堆栈跟踪:

Child SP               IP Call Site
0000005a92b5e438 00007ff8a11c0c6a [GCFrame: 0000005a92b5e438] 
0000005a92b5e660 00007ff8a11c0c6a [GCFrame: 0000005a92b5e660] 
0000005a92b5e698 00007ff8a11c0c6a [HelperMethodFrame: 0000005a92b5e698] System.Threading.Monitor.Enter(System.Object)
0000005a92b5e790 00007ff88f30096b System.Threading.TimerQueueTimer.Fire()
0000005a92b5e7e0 00007ff88f2e1a1d System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
0000005a92b5e820 00007ff88f2e1f70 System.Threading.ThreadPoolWorkQueue.Dispatch()
0000005a92b5ed48 00007ff890413753 [DebuggerU2MCatchHandlerFrame: 0000005a92b5ed48]
Run Code Online (Sandbox Code Playgroud)

完整堆栈跟踪:

 # Child-SP          RetAddr           : Args to Child                                                           : Call Site
00 0000005a`9cf5e9a8 …
Run Code Online (Sandbox Code Playgroud)

c# multithreading rabbitmq quartz.net kestrel

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

使用新的Image()进行点击跟踪是否安全?

我正在开发一个点击跟踪系统来监控我公司产品在外部(客户)网站上的使用情况.我希望能够告诉我的客户只需使用onclick对任何元素进行javascript调用.

我目前的方法是使用Image()对象为我的跟踪服务器创建请求.这很好用,但我对这是否安全有疑问.如果我把它放在一个链接上,我可以确定我的请求是在浏览器跟随链接之前发送的吗?我的测试表明我做不到.

所以我尝试使用onclick ="return MyFunction()",当且仅当图像加载完毕时才返回true.但是我无法在Myfunction()中阻塞线程时加载图像,因为javascript只在一个线程上运行.所以我必须使用一个阻塞调用该块的请求说500毫秒这将减少未被发送的请求的危险性,但降低了网站性能.

另一种方法是在加载图像之后使用回调等来处理页面切换.就像是:

<a href="http://www.google.som" onclick="return MyFunction(this)">Link</a>

<script type="text/javascript">

function MyFunction(theLink)
{
var img  = new Image();
img.onload = function(){ location.href=theLink.href; }
img.src = "http://www.myserver.com/trackclick";

return false;

}

</script>
Run Code Online (Sandbox Code Playgroud)

这将要求我的客户按上述要求实施该功能.此外,如果由于某种原因图像没有加载(例如我的服务器停机),客户站点将会中断.

我检查了谷歌的ga.js,它表明他们使用某种阻止而不是事件处理和回调.但话说回来,他们的代码有意难以理解.

我的问题是:

  1. 在浏览器跟踪链接之前,我是否可以确定在onclick事件中使用新Image().src的请求,或者我是否需要使用延迟?

  2. 浏览器和浏览器版本之间的这种行为有何不同

  3. 是否有一种"最佳实践"方式来进行我尚未找到的点击跟踪?

编辑:4.有谁知道Google Analytics如何做到这一点?他们似乎使用onclick ="MyFunction()"方法,没有返回语句或回调.

javascript onclick

4
推荐指数
1
解决办法
1839
查看次数