我正在尝试使用官方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.为什么不正确地序列化鉴别器?
感谢您的时间.
我正在尝试理解 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 …
我们有一个使用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) 我正在开发一个点击跟踪系统来监控我公司产品在外部(客户)网站上的使用情况.我希望能够告诉我的客户只需使用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,它表明他们使用某种阻止而不是事件处理和回调.但话说回来,他们的代码有意难以理解.
我的问题是:
在浏览器跟踪链接之前,我是否可以确定在onclick事件中使用新Image().src的请求,或者我是否需要使用延迟?
浏览器和浏览器版本之间的这种行为有何不同
是否有一种"最佳实践"方式来进行我尚未找到的点击跟踪?
编辑:4.有谁知道Google Analytics如何做到这一点?他们似乎使用onclick ="MyFunction()"方法,没有返回语句或回调.
c# ×2
.net ×1
borrowing ×1
generics ×1
inheritance ×1
javascript ×1
kestrel ×1
mongodb ×1
onclick ×1
quartz.net ×1
rabbitmq ×1
reference ×1
rust ×1