小编dnx*_*dnx的帖子

ConcurrentQueue导致内存泄漏

使用时我有内存泄漏ConcurrentQueue:

requestObject request = xxx;

Item obj= new Item ();
obj.MessageReceived += obj_MessageReceived;
obj.Exited += obj_Exited;

request.Key = obj.Key;

obj.AddRequest(request);

_queue.TryAdd(obj.Key, obj);
Run Code Online (Sandbox Code Playgroud)

在"已退出"回调中,我处置资源:

void LiveSphere_Exited(string key)
{
    Item instance;

    _queue.TryRemove(key, out instance);

    Task.Factory.StartNew(() =>
    {
        var wait = new SpinWait();
        while (instance.MessageCount > 0)
        {
            wait.SpinOnce();
        }
    })
    .ContinueWith((t) =>
    {
         if (instance != null)
         {
             //Cleanup resources
             instance.MessageReceived -= obj_MessageReceived;
             instance.Exited -= obj_Exited;
             instance.Dispose();
             instance = null;
         }
    });
}
Run Code Online (Sandbox Code Playgroud)

当我分析代码时,我仍然有一个根引用的"Item"对象,但我不知道我可以在哪里处理......,退出的方法被触发,_queue已从队列中删除了"Item"对象.

当我阅读文档时,concurrentqueue将引用复制到队列中.

你能帮我找出内存泄漏的位置吗?

c# memory-leaks

8
推荐指数
2
解决办法
5351
查看次数

MSMQ导致Windows 8与BSOD崩溃

我使用的是Windows 8 Pro,C#和.NET 4.5

我使用MSMQ在REMOTE机器上读取或查看或发送消息,但它导致操作系统出现BSOD ...

本地没有问题,但只有当我尝试通过代码访问msmq远程机器时.

该代码在XP/Seven和Server 2008/2012下完美运行

这是一个小样本:

var messageQueue = new MessageQueue(string.Concat("FormatName:DIRECT=", addressType, ":", _queueServer, @"\private$\", _queueName), false, false, QueueAccessMode.Receive);

messageQueue.Receive() => BSOD!!!
Run Code Online (Sandbox Code Playgroud)

有人有解决方法或解释吗?

谢谢,

亲切的问候.

c# msmq windows-8

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

标签 统计

c# ×2

memory-leaks ×1

msmq ×1

windows-8 ×1