线程WaitOne和ReleaseMutex C#列表引用vs复制所有值

时间:2017-04-24 06:38:37

标签: c# mysql multithreading

在C#中,我想知道使用代码referencing a List变量与copying all the values的性能差异

new List<>(otherlist)

我有一个线程,我在其中持有少量MySQL查询List<MySqlCommand>,并且还有一个SELECT查询,需要每隔30秒执行一次。

当线程正在运行时,此List<MySqlCommand>将从其他代码更新。

为此,我编写了一个锁码,将List中的值复制到本地List,如下所示protected override void ThreadFunction()

Mutex lock= new Mutex();
.....
.....
lock.WaitOne();
List<MySqlCommand> currentSql = sqlHistory;
sqlHistory = new List<MySqlCommand>();
lock.ReleaseMutex();

我觉得每30秒我就会创建一个新的对象实例

我的问题是,如果我们这样做会怎么样

Mutex lock= new Mutex();
.....
.....
lock.WaitOne();
List<MySqlCommand> currentSql = new List<MySqlCommand>(sqlHistory);
sqlHistory.Clear();
lock.ReleaseMutex();

复制是否会降低性能或内存泄漏。哪一个会更好。

1 个答案:

答案 0 :(得分:0)

我认为没有最好的&#39;或者最快的方式,每30秒执行一次。两者都不泄漏。但对于逻辑;创建新列表并复制项目听起来很愚蠢。

您应该选择最易读的方式。但是,我宁愿使用lock,因为它使用了try / finally。每当抛出异常时,您需要确保释放锁定。

我主要使用这种结构进行批处理:

MySqlCommand[] copy;

lock(_sqlHistory)
{
    copy = _sqlHistory.ToArray();
    _sqlHistory.Clear();
}

foreach(var command in copy)
{
    // ...
}

接下来的问题,为什么每30秒执行一次尖峰会产生尖峰?