用于LocalDb线程同步的Lock语句与AutoResetEvent

时间:2013-12-12 10:20:14

标签: linq-to-sql windows-phone-8 thread-safety windows-phone

我正在编写一个利用Windows Phone的LocalDB功能的应用程序。我意识到我需要确保只有一个线程在给定数据库上执行操作,因此我创建了一个AutoResetEvent对象来协调各种线程争夺对数据库的访问权。我的代码非常类似:

class SomeClass
{
    AutoResetEvent DatabaseLock = new AutoResetEvent(true);

    public async void AddData(Person person)
    {
        await Task.Run(() =>
        {

            MyDataContext db = null;

            try
            {
                this.DatabaseLock.WaitOne();

                db = MyDataContext.GetInstance();
                db.People.InsertOnSubmit(person);
                db.SubmitChanges();
            }
            finally
            {
                if (db == null)
                    db.Dispose();

                this.DatabaseLock.Set();
            }
        }
    }
}

显然,这不是真正的代码,但它是相同的一般模式。无论如何,我决定在这里使用AutoResetEvent对象,正如我在多个位置在线建议的那样。但是,我倾向于使用lock {...}语句。

有没有理由使用AutoResetEvent?与lock对象相比,我觉得它很慢。

1 个答案:

答案 0 :(得分:0)

当您需要向另一个帖子发出信号时,您应该使用AutoResetEvent

在这种情况下,您只是锁定资源,因此lock语句将是更好的选择。